python基于socket实现的UDP及TCP通讯功能示例


Posted in Python onNovember 01, 2019

本文实例讲述了python基于socket实现的UDP及TCP通讯功能。分享给大家供大家参考,具体如下:

Server:

import socket
address = ('127.0.0.1', 31500)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(address)
while True:
  data, addr = s.recvfrom(2048)
  if not data:
    print "client has exist"
    break
  print "received:", data, "from", addr
s.close()

Client:

import socket
address = ('127.0.0.1', 31500)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
  msg = raw_input()
  if not msg:
    break
  s.sendto(msg, address)
s.close()

运行结果:

server

[work@db-testing python]$ python udp_ss.py
received: aaaaaa from ('127.0.0.1', 10169)
received: 123456 from ('127.0.0.1', 10169)
received: abcdef from ('127.0.0.1', 10169)

client

[work@db-testing python]$ python udp_cc.py
aaaaaa
123456
abcdef
[work@db-testing python]$

前言

python实在是太方便,太易用了,三方库的支持又全,语法又简单,对开发人员来说,实在是居家旅行,XXXX的必备利器。周末研究了下python的网络支持,做一下记录,以备随后翻阅。

python支持BSD的socket进行网络编程,其API跟C中的大同小异,先看看TCP方式的,说到网络编程,肯定会设计到server和client,分别来看下

TCP方式

server端

server端的socket一般流程是这样:

  1. 建立一个socket(可以选择socket类型INET,UNIX等,以及连接方式TCP/UDP)
  2. 使用bind公开一个端口,使得client可以方便连接
  3. 设置一个listen队列的大小
  4. 进入一个无限循环,在此无限循环中,使用accept函数来等待客户连接,此函数返回一个新的socket, 对应于客户端的socket,建立通信信道。对socket的处理一般放在外部单独的函数中(并发)
  5. 通过send()/recv()来对socket进行读写操作

好了,下面看一下例子:

netserver.py

#!/usr/bin/env python
# -*- coding:utf8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import socket
class NetServer(object):
  def tcpServer(self):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('', 9527))    # 绑定同一个域名下的所有机器
    sock.listen(5)
    while True:
      clientSock, (remoteHost, remotePort) = sock.accept()
      print("[%s:%s] connect" % (remoteHost, remotePort))   # 接收客户端的ip, port
      revcData = clientSock.recv(1024)
      sendDataLen = clientSock.send("this is send data from server")
      print "revcData: ", revcData
      print "sendDataLen: ", sendDataLen
      clientSock.close()
if __name__ == "__main__":
  netServer = NetServer()
  netServer.tcpServer()

client端

  1. 建立一个新的socket
  2. 使用connect函数与远程主机获得连接
  3. 在此socket上进行I/O操作

netclient.py

#!/usr/bin/env python
# -*- coding:utf8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import socket
class NetClient(object):
  def tcpclient(self):
    clientSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    clientSock.connect(('localhost', 9527))
    sendDataLen = clientSock.send("this is send data from client")
    recvData = clientSock.recv(1024)
    print "sendDataLen: ", sendDataLen
    print "recvData: ", recvData
    clientSock.close()
if __name__ == "__main__":
  netClient = NetClient()
  netClient.tcpclient()

运行结果:

1) 先启动 netserver.py, 然后启动 netclient.py,注意client先发送后接收,server是先接收后发送,顺序要交错

2) server 打印结果:

[127.0.0.1:55279] connect
revcData:  this is send data from client
sendDataLen:  30

3) client 打印结果:

sendDataLen:  29
recvData:  this is send  data from server

由代码量可见python之简单,想要将这个例子改造成一个文件传输器,估计只需要增加不到20行代码即可。

UDP方式

UDP号称无连接传输,全然没有TCP那么复杂,三次握手,错误重传之类的机制都没有,发的只管发,收得只管收,收到没有?不知道,顺序不对怎么办?不管!就是这样,但是速度就要比TCP高得多了。在对数据帧要求不是很高的地方,这确实是很好用的,比如网络上的视频传输,音频传输等。

server端

  1. 建立数据报形式的socket
  2. 公开一个端口,一边客户端连接
  3. 开始接收数据

udpserver.py

#!/usr/bin/env python
# -*- coding:utf8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import socket
class UdpServer(object):
  def tcpServer(self):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(('', 9527))    # 绑定同一个域名下的所有机器
    while True:
      revcData, (remoteHost, remotePort) = sock.recvfrom(1024)
      print("[%s:%s] connect" % (remoteHost, remotePort))   # 接收客户端的ip, port
      sendDataLen = sock.sendto("this is send data from server", (remoteHost, remotePort))
      print "revcData: ", revcData
      print "sendDataLen: ", sendDataLen
    sock.close()
if __name__ == "__main__":
  udpServer = UdpServer()
  udpServer.tcpServer()

需要注意的是,server中address元组中的引号表示可以接受任何地址来的数据报,TCP例子中的则表示可以接受任意地址发起的连接。

client端

  1. 新建一个数据报socket
  2. 收发数据

udpclient.py

#!/usr/bin/env python
# -*- coding:utf8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import socket
class UdpClient(object):
  def tcpclient(self):
    clientSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sendDataLen = clientSock.sendto("this is send data from client", ('localhost', 9527))
    recvData = clientSock.recvfrom(1024)
    print "sendDataLen: ", sendDataLen
    print "recvData: ", recvData
    clientSock.close()
if __name__ == "__main__":
  udpClient = UdpClient()
  udpClient.tcpclient()

运行结果:

1) 先启动 udpserver.py,然后启动 udpclient.py,并且保证client先发后收,server先收后发

2) server 结果(client 连续发送了三次请求):

[127.0.0.1:37219] connect
revcData:  this is send data from client
sendDataLen:  30
[127.0.0.1:57622] connect
revcData:  this is send data from client
sendDataLen:  30
[127.0.0.1:52290] connect
revcData:  this is send data from client
sendDataLen:  30

3) client 结果:

sendDataLen:  29
recvData:  ('this is send  data from server', ('127.0.0.1', 9527))

文中给出的例子已经具有网络程序的基本结构,在实际应用中,应该自行扩展对socket的处理,socket说到底跟文件句柄,文件描述符,管道描述符等都是一个概念,可以对其进行I/O处理,事实上,在UNIX类系统中,对socket的操作跟对文件句柄的操作没有任何形式上的差异。

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python列表操作使用示例分享
Feb 21 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
Jul 13 Python
Django实现简单分页功能的方法详解
Dec 05 Python
python实现Floyd算法
Jan 03 Python
Python中max函数用于二维列表的实例
Apr 03 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
Jan 09 Python
python for循环remove同一个list过程解析
Aug 14 Python
Python turtle库绘制菱形的3种方式小结
Nov 23 Python
Pytorch模型转onnx模型实例
Jan 15 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
May 09 Python
python实现最短路径的实例方法
Jul 19 Python
Python爬虫 简单介绍一下Xpath及使用
Apr 26 Python
python中time库的实例使用方法
Oct 31 #Python
Django实现分页显示效果
Oct 31 #Python
Django实现基于类的分页功能
Oct 31 #Python
python Django框架实现web端分页呈现数据
Oct 31 #Python
python3常用的数据清洗方法(小结)
Oct 31 #Python
Django实现网页分页功能
Oct 31 #Python
8段用于数据清洗Python代码(小结)
Oct 31 #Python
You might like
IIS+fastcgi下PHP运行超时问题的解决办法详解
2013/06/20 PHP
ThinkPHP标签制作教程
2014/07/10 PHP
php更新mysql后获取改变行数的方法
2014/12/25 PHP
使用php实现从身份证中提取生日
2016/05/09 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
thinkPHP5.0框架引入Traits功能实例分析
2017/03/18 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
JQuery jsonp 使用示例代码
2009/08/12 Javascript
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
form.submit()不能提交表单的错误原因及解决方法
2014/10/13 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
2015/09/17 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
2017/08/21 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
Python读取图片属性信息的实现方法
2016/09/11 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
对python中的乘法dot和对应分量相乘multiply详解
2018/11/14 Python
Python绘图实现显示中文
2019/12/04 Python
python 实现检验33品种数据是否是正态分布
2019/12/09 Python
python实现高斯投影正反算方式
2020/01/17 Python
Python全面分析系统的时域特性和频率域特性
2020/02/26 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
html5实现滑块功能之type="range"属性
2020/02/18 HTML / CSS
Guess欧洲官网:美国服饰品牌
2019/08/06 全球购物
C语言中break与continue的区别
2012/07/12 面试题
现代化办公人员工作的自我评价
2013/10/16 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
民警个人对照检查剖析材料
2014/09/17 职场文书
2014年公务员转正工作总结
2014/11/07 职场文书
员工拾金不昧表扬稿
2015/05/05 职场文书
Python的三个重要函数详解
2022/01/18 Python
css弧边选项卡的项目实践
2023/05/07 HTML / CSS