在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开发之基于thread线程搜索本地文件的方法
Nov 11 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
Python实现将Excel转换为json的方法示例
Aug 05 Python
读取本地json文件,解析json(实例讲解)
Dec 06 Python
解决python3爬虫无法显示中文的问题
Apr 12 Python
Python实现求解括号匹配问题的方法
Apr 17 Python
python实现超简单的视频对象提取功能
Jun 04 Python
python 正确保留多位小数的实例
Jul 16 Python
Python MySQLdb 执行sql语句时的参数传递方式
Mar 04 Python
500行python代码实现飞机大战
Apr 24 Python
Python格式化输出--%s,%d,%f的代码解析
Apr 29 Python
详解Python模块化编程与装饰器
Jan 16 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将数据库中的电话号码读取出来并生成图片
2008/08/31 PHP
PHP字符串中特殊符号的过滤方法介绍
2014/02/18 PHP
CodeIgniter模板引擎使用实例
2014/07/15 PHP
Codeigniter的dom类用法实例
2015/06/26 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
PHP使用XMLWriter读写xml文件操作详解
2018/07/31 PHP
PHP利用百度ai实现文本和图片审核
2019/05/08 PHP
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
2011/07/31 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
jQuery 联动日历实现代码
2012/05/31 Javascript
jcrop基本参数一览
2013/07/16 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
2013/09/29 Javascript
js判断鼠标左、中、右键哪个被点击的方法
2015/01/27 Javascript
自制微信公众号一键排版工具
2016/09/22 Javascript
利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
2017/01/13 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
Vue多系统切换实现方案
2018/06/05 Javascript
layui的layedit富文本赋值方法
2019/09/18 Javascript
Vue组件为什么data必须是一个函数
2020/06/11 Javascript
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
详解Python的Django框架中Manager方法的使用
2015/07/21 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
15行Python代码实现网易云热门歌单实例教程
2019/03/10 Python
python 视频逐帧保存为图片的完整实例
2019/12/10 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
python与js主要区别点总结
2020/09/13 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
俄罗斯化妆品和香水网上商店:Iledebeaute
2019/01/03 全球购物
西安交大自主招生自荐信
2014/01/27 职场文书
疾病捐款倡议书
2014/05/13 职场文书
党员政治学习材料
2014/05/14 职场文书
大专生求职信
2014/06/29 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书