在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批量转换文件编码格式
May 17 Python
Python中random模块生成随机数详解
Mar 10 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
Mar 20 Python
Python基于贪心算法解决背包问题示例
Nov 27 Python
Python实现的计算器功能示例
Apr 26 Python
PyTorch学习笔记之回归实战
May 28 Python
Django框架使用富文本编辑器Uedit的方法分析
Jul 31 Python
python+Django+pycharm+mysql 搭建首个web项目详解
Nov 29 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
Python爬虫爬取电影票房数据及图表展示操作示例
Mar 27 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
Jul 02 Python
python中Django文件上传方法详解
Aug 05 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实现监控varnish缓存服务器的状态
2014/12/30 PHP
php显示指定目录下子目录的方法
2015/03/20 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
2017/03/23 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
js 实现在离开页面时提醒未保存的信息(减少用户重复操作)
2013/01/16 Javascript
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
基于jquery实现的省市区级联无ajax
2013/09/24 Javascript
javascript中怎么做对象的类型判断
2013/11/11 Javascript
jquery实现的一个文章自定义分段显示功能
2014/05/23 Javascript
js/jquery判断浏览器的方法小结
2014/09/02 Javascript
使用jquery组件qrcode生成二维码及应用指南
2015/02/22 Javascript
jQuery实现tab选项卡效果的方法
2015/07/08 Javascript
javascript回到顶部特效
2016/07/30 Javascript
jQuery根据ID、CLASS、等获取对象的实例
2016/12/04 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
Vue.js仿Metronic高级表格(一)静态设计
2017/04/17 Javascript
vue iview多张图片大图预览、缩放翻转
2019/07/13 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
p5.js绘制旋转的正方形
2019/10/23 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
使用Python多线程爬虫爬取电影天堂资源
2016/09/23 Python
把csv文件转化为数组及数组的切片方法
2018/07/04 Python
python实现爬取图书封面
2018/07/05 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
10的分与合教学反思
2014/04/30 职场文书
教师师德演讲稿
2014/05/06 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
护士自我推荐信范文
2015/03/24 职场文书
收入证明范本
2015/06/12 职场文书
《哪吒之魔童降世》观后感:世上哪有随随便便的成功
2019/11/08 职场文书
JavaScript实现简单计时器
2021/06/22 Javascript
python图片灰度化处理的几种方法
2021/06/23 Python
Apache POI的基本使用详解
2021/11/07 Servers
Python中 range | np.arange | np.linspace三者的区别
2022/03/22 Python
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python