在Python下进行UDP网络编程的教程


Posted in Python onApril 29, 2015

TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对TCP,UDP则是面向无连接的协议。

使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。

虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议。

我们来看看如何通过UDP协议传输数据。和TCP类似,使用UDP的通信双方也分为客户端和服务器。服务器首先需要绑定端口:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口:
s.bind(('127.0.0.1', 9999))

创建Socket时,SOCK_DGRAM指定了这个Socket的类型是UDP。绑定端口和TCP一样,但是不需要调用listen()方法,而是直接接收来自任何客户端的数据:

print 'Bind UDP on 9999...'
while True:
  # 接收数据:
  data, addr = s.recvfrom(1024)
  print 'Received from %s:%s.' % addr
  s.sendto('Hello, %s!' % data, addr)

recvfrom()方法返回数据和客户端的地址与端口,这样,服务器收到数据后,直接调用sendto()就可以把数据用UDP发给客户端。

注意这里省掉了多线程,因为这个例子很简单。

客户端使用UDP时,首先仍然创建基于UDP的Socket,然后,不需要调用connect(),直接通过sendto()给服务器发数据:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in ['Michael', 'Tracy', 'Sarah']:
  # 发送数据:
  s.sendto(data, ('127.0.0.1', 9999))
  # 接收数据:
  print s.recv(1024)
s.close()

从服务器接收数据仍然调用recv()方法。

仍然用两个命令行分别启动服务器和客户端测试,结果如下:

在Python下进行UDP网络编程的教程

小结

UDP的使用与TCP类似,但是不需要建立连接。此外,服务器绑定UDP端口和TCP端口互不冲突,也就是说,UDP的9999端口与TCP的9999端口可以各自绑定。

源码参考:https://github.com/michaelliao/learn-python/tree/master/socket

Python 相关文章推荐
python提取字典key列表的方法
Jul 11 Python
浅谈Python基础之I/O模型
May 11 Python
tensorflow识别自己手写数字
Mar 14 Python
PYTHON基础-时间日期处理小结
May 05 Python
python Pexpect 实现输密码 scp 拷贝的方法
Jan 03 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
Jan 15 Python
详解如何减少python内存的消耗
Aug 09 Python
在Pytorch中计算自己模型的FLOPs方式
Dec 30 Python
python print 格式化输出,动态指定长度的实现
Apr 12 Python
python3.6使用SMTP协议发送邮件
May 20 Python
使用Python FastAPI构建Web服务的实现
Jun 08 Python
pytorch判断是否cuda 判断变量类型方式
Jun 23 Python
用Python进行TCP网络编程的教程
Apr 29 #Python
为Python程序添加图形化界面的教程
Apr 29 #Python
python执行get提交的方法
Apr 29 #Python
在Python中使用PIL模块处理图像的教程
Apr 29 #Python
python获得linux下所有挂载点(mount points)的方法
Apr 29 #Python
python创建和删除目录的方法
Apr 29 #Python
python访问系统环境变量的方法
Apr 29 #Python
You might like
php中获取指定IP的物理地址的代码(正则表达式)
2011/06/23 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
2017/01/20 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
javascript 客户端验证上传图片的大小(兼容IE和火狐)
2009/08/15 Javascript
JS 控制非法字符的输入代码
2009/12/04 Javascript
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
Bootstrap项目实战之子栏目资讯内容
2016/04/25 Javascript
IScroll5 中文API参数说明和调用方法
2016/05/21 Javascript
微信小程序实现移动端滑动分页效果(ajax)
2017/06/13 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
Angularjs按需查询实例代码
2017/10/30 Javascript
three.js 入门案例详解
2018/01/23 Javascript
layer.open关闭父窗口 以及调用父页面的方法
2018/08/17 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
js验证身份证号码记录的方法
2019/04/26 Javascript
Vue 中使用 typescript的方法详解
2020/02/17 Javascript
[23:21]Ti4 冒泡赛第二轮DK vs C9 2
2014/07/14 DOTA
python将人民币转换大写的脚本代码
2013/02/10 Python
python实现在sqlite动态创建表的方法
2015/05/08 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
2016/04/09 Python
用Pygal绘制直方图代码示例
2017/12/07 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
对Django项目中的ORM映射与模糊查询的使用详解
2019/07/18 Python
python使用SQLAlchemy操作MySQL
2020/01/02 Python
python 将dicom图片转换成jpg图片的实例
2020/01/13 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
高三语文教学反思
2014/01/15 职场文书
优秀教师先进材料
2014/12/16 职场文书
大班上学期个人总结
2015/02/13 职场文书
高中信息技术教学反思
2016/02/16 职场文书
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android
MySQL选择合适的备份策略和备份工具
2022/06/01 MySQL