在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的类变量和成员变量用法实例教程
Aug 25 Python
python获取Linux下文件版本信息、公司名和产品名的方法
Oct 05 Python
Python获取Windows或Linux主机名称通用函数分享
Nov 22 Python
Python实现简单求解给定整数的质因数算法示例
Mar 25 Python
Python对数据进行插值和下采样的方法
Jul 03 Python
Python基于多线程实现ping扫描功能示例
Jul 23 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
关于Pycharm无法debug问题的总结
Jan 19 Python
基于python判断字符串括号是否闭合{}[]()
Sep 21 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 Python
python 模块导入问题汇总
Feb 01 Python
python pandas 解析(读取、写入)CSV 文件的操作方法
Dec 24 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
thinkphp模板的包含与渲染实例分析
2014/11/26 PHP
php缓冲输出实例分析
2015/01/05 PHP
PHP生成树的方法
2015/07/28 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
2016/08/11 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
用按钮控制iframe显示的网页实现方法
2013/02/04 Javascript
jQuery .attr()和.removeAttr()方法操作元素属性示例
2013/07/16 Javascript
可兼容IE的获取及设置cookie的jquery.cookie函数方法
2013/09/02 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
JavaScript之promise_动力节点Java学院整理
2017/07/03 Javascript
vue.js图片转Base64上传图片并预览的实现方法
2018/08/02 Javascript
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
Vue 动态组件与 v-once 指令的实现
2019/02/12 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
nodejs开发一个最简单的web服务器实例讲解
2020/01/02 NodeJs
jquery实现拖拽小方块效果
2020/12/10 jQuery
Python实现多进程共享数据的方法分析
2017/12/04 Python
Python实现简单网页图片抓取完整代码实例
2017/12/15 Python
python梯度下降法的简单示例
2018/08/31 Python
python之array赋值技巧分享
2019/11/28 Python
如何更改 pandas dataframe 中两列的位置
2019/12/27 Python
Django CSRF认证的几种解决方案
2020/03/03 Python
如何解决python多种版本冲突问题
2020/10/13 Python
HTML5之WebGL 3D概述(上)—WebGL原生开发开启网页3D渲染新时代
2013/01/31 HTML / CSS
Bluebella美国官网:英国性感内衣品牌
2018/10/04 全球购物
英国计算机商店:Technextday
2019/12/28 全球购物
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
建筑总经理岗位职责
2014/02/02 职场文书
终止或解除劳动合同及劳动关系的证明书
2014/10/06 职场文书
2014年收银工作总结
2014/11/13 职场文书