在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用GET方法上传文件
Mar 10 Python
Python字符串匹配算法KMP实例
Jul 18 Python
Python温度转换实例分析
Jan 17 Python
详解Python下ftp上传文件linux服务器
Jun 21 Python
基于Python实现用户管理系统
Feb 26 Python
Pandas中DataFrame的分组/分割/合并的实现
Jul 16 Python
Python数学形态学实例分析
Sep 06 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
Feb 29 Python
执行Python程序时模块报错问题
Mar 26 Python
django模型类中,null=True,blank=True用法说明
Jul 09 Python
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
Mar 29 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
Re:从零开始的异世界生活 第2季 开播啦
2020/07/24 日漫
php 三维饼图的实现代码
2008/09/28 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
jquery里的正则表达式说明
2011/08/03 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
正则表达式中特殊符号及正则表达式的几种方法总结(replace,test,search)
2013/11/26 Javascript
JavaScript中的操作符==与===介绍
2014/12/31 Javascript
javascript 获取浏览器版本
2015/01/21 Javascript
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
jquery使用经验小结
2015/05/20 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
2016/08/17 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
2020/09/18 Javascript
vue-router 按需加载 component: () => import() 报错的解决
2020/09/22 Javascript
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
python 图片验证码代码
2008/12/07 Python
python控制台英汉汉英电子词典
2020/04/23 Python
简介Django框架中可使用的各类缓存
2015/07/23 Python
Python读取一个目录下所有目录和文件的方法
2016/07/15 Python
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
python实现飞行棋游戏
2020/02/05 Python
HTML5 Canvas实现图片缩放、翻转、颜色渐变的代码示例
2016/02/28 HTML / CSS
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
台湾专柜女包:KINAZ
2019/12/26 全球购物
Java多态性的定义以及类型
2014/09/16 面试题
求职简历中个人的自我评价
2013/12/25 职场文书
公积金转移接收函
2014/01/11 职场文书
CAD制图人员的自荐信
2014/02/07 职场文书
2014县政府领导班子对照检查材料思想汇报
2014/09/25 职场文书
防火标语大全
2014/10/06 职场文书
2015年社会实践个人总结
2015/03/06 职场文书
ORM模型框架操作mysql数据库的方法
2021/07/25 MySQL
Python数据结构之队列详解
2022/03/21 Python