在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中用于计算对数的log()方法
May 15 Python
Python的socket模块源码中的一些实现要点分析
Jun 06 Python
Python自动化测试ConfigParser模块读写配置文件
Aug 15 Python
Python 数据结构之旋转链表
Feb 25 Python
Python更新数据库脚本两种方法及对比介绍
Jul 27 Python
Python实现采用进度条实时显示处理进度的方法
Dec 19 Python
Python批量发送post请求的实现代码
May 05 Python
在pycharm中设置显示行数的方法
Jan 16 Python
python统计指定目录内文件的代码行数
Sep 19 Python
基于Python实现大文件分割和命名脚本过程解析
Sep 29 Python
windows10在visual studio2019下配置使用openCV4.3.0
Jul 14 Python
python等待10秒执行下一命令的方法
Jul 19 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环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
JS target与currentTarget区别说明
2011/08/28 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
Javascript让DEDECMS告别手写Tag
2014/09/01 Javascript
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
jQuery插件formValidator实现表单验证
2016/05/23 Javascript
引用jquery框架后出错的解决方法
2016/08/09 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
XMLHttpRequest对象_Ajax异步请求重点(推荐)
2017/09/28 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
使用Vue.js和Element-UI做一个简单登录页面的实例
2018/02/23 Javascript
JavaScript实现区块链
2018/03/14 Javascript
vue如何引入sass全局变量
2018/06/28 Javascript
vue项目里面引用svg文件并给svg里面的元素赋值
2020/08/17 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
2020/11/09 Javascript
详解Django中的过滤器
2015/07/16 Python
简单谈谈Python中的闭包
2016/11/30 Python
python解析基于xml格式的日志文件
2017/02/25 Python
使用Pyinstaller的最新踩坑实战记录
2017/11/08 Python
Python实现判断一行代码是否为注释的方法
2018/05/23 Python
Python简单处理坐标排序问题示例
2019/07/11 Python
Python遍历字典方式就实例详解
2019/12/28 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
selenium自动化测试入门实战
2020/12/21 Python
CSS3 不定高宽垂直水平居中的几种方式
2020/03/26 HTML / CSS
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
门卫岗位安全职责
2013/12/13 职场文书
幼儿园亲子活动总结
2014/04/26 职场文书
运动会入场口号
2014/06/07 职场文书
python 如何执行控制台命令与操作剪切板
2021/05/20 Python