在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根据开头和结尾字符串获取中间字符串的方法
Mar 26 Python
Python字符串处理函数简明总结
Apr 13 Python
python中Matplotlib实现绘制3D图的示例代码
Sep 04 Python
微信跳一跳辅助python代码实现
Jan 05 Python
WxPython建立批量录入框窗口
Feb 27 Python
Python中typing模块与类型注解的使用方法
Aug 05 Python
python实现的按要求生成手机号功能示例
Oct 08 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
Jan 08 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
May 22 Python
Python-openCV开运算实例
Jul 05 Python
Python自省及反射原理实例详解
Jul 06 Python
Python项目实战之使用Django框架实现支付宝付款功能
Feb 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
PHP4中实现动态代理
2006/10/09 PHP
NO3第三帝国留言簿制作过程
2006/10/09 PHP
PHP之COOKIE支持详解
2010/09/20 PHP
php数组去重的函数代码
2013/02/03 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
php实现基于openssl的加密解密方法
2016/09/30 PHP
巧妙破除网页右键禁用的十大绝招
2006/08/12 Javascript
javascript-TreeView父子联动效果保持节点状态一致
2007/08/12 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
利用div+jquery自定义滚动条样式的2种方法
2013/07/18 Javascript
查找iframe里元素的方法可传参
2013/09/11 Javascript
escape函数解决js中ajax传递中文出现乱码问题
2014/10/30 Javascript
基于javascript实现九宫格大转盘效果
2020/05/28 Javascript
js对象浅拷贝和深拷贝详解
2016/09/05 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
JS实现留言板功能
2017/06/17 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
解决layer 动态加载select 失效的问题
2019/09/18 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
python使用htmllib分析网页内容的方法
2015/05/08 Python
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
JD Sports德国官网:英国领先的运动鞋和运动服饰零售商
2018/02/26 全球购物
Under Armour安德玛中国官网:美国高端运动科技品牌
2018/03/09 全球购物
"引用"与多态的关系
2013/02/01 面试题
办公室前台的岗位职责
2013/12/20 职场文书
房屋租赁意向书
2014/04/01 职场文书
幼儿园春季开学寄语
2014/04/03 职场文书
保安公司服务承诺书
2014/05/28 职场文书
技术支持岗位职责
2015/02/13 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
幼儿教师远程研修感悟
2015/11/18 职场文书