在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之玩转字符串(2)更新篇
Sep 28 Python
跟老齐学Python之for循环语句
Oct 02 Python
Python 中urls.py:URL dispatcher(路由配置文件)详解
Mar 24 Python
python3 kmp 字符串匹配的方法
Jul 07 Python
元组列表字典(莫烦python基础)
Apr 03 Python
Python 中包/模块的 `import` 操作代码
Apr 22 Python
Python计算公交发车时间的完整代码
Feb 12 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
Aug 03 Python
python获取本周、上周、本月、上月及本季的时间代码实例
Sep 08 Python
关于探究python中sys.argv时遇到的问题详解
Feb 23 Python
python装饰器代码深入讲解
Mar 01 Python
Python 内置函数速查表一览
Jun 02 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设计模式 DAO(数据访问对象模式)
2011/06/26 PHP
PHP插入排序实现代码
2013/04/04 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
js图片模糊切换显示特效的方法
2015/02/17 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
iframe中使用jquery进行查找的方法【案例分析】
2016/06/17 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
2016/09/17 Javascript
HTML5实现微信拍摄上传照片功能
2017/04/21 Javascript
JS实现可视化文件上传
2018/09/08 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
微信小程序的引导页实现代码
2020/06/24 Javascript
原生js实现简单轮播图
2020/10/26 Javascript
简介Django框架中可使用的各类缓存
2015/07/23 Python
简单了解什么是神经网络
2017/12/23 Python
python将控制台输出保存至文件的方法
2019/01/07 Python
利用python实现短信和电话提醒功能的例子
2019/08/08 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
python代码打印100-999之间的回文数示例
2019/11/24 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
美国家居装饰店:Z Gallerie
2020/12/28 全球购物
班级安全教育实施方案
2014/02/23 职场文书
《老王》教学反思
2014/02/23 职场文书
保险专业大学生职业规划书
2014/03/03 职场文书
《青海高原一株柳》教学反思
2014/04/25 职场文书
北京奥运会口号
2014/06/21 职场文书
2014最新离职证明范本
2014/09/12 职场文书
运动会铅球比赛加油稿
2014/09/26 职场文书
个人融资协议书
2014/10/02 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
python机器学习创建基于规则聊天机器人过程示例详解
2021/11/02 Python