在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 mysqldb连接数据库
Mar 16 Python
零基础写python爬虫之urllib2使用指南
Nov 05 Python
Python新手在作用域方面经常容易碰到的问题
Apr 03 Python
Linux下python3.6.1环境配置教程
Sep 26 Python
python爬虫爬取监控教务系统的思路详解
Jan 08 Python
PyQt5 界面显示无响应的实现
Mar 26 Python
python由已知数组快速生成新数组的方法
Apr 08 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
Jun 09 Python
Python如何对XML 解析
Jun 28 Python
Python3爬虫中pyspider的安装步骤
Jul 29 Python
python 如何实现遗传算法
Sep 22 Python
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
Apr 25 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 不同编码下的字符串长度区分
2009/09/26 PHP
PHP实现获取某个月份周次信息的方法
2015/08/11 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
使用C++为node.js写扩展模块
2015/04/22 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
javascript实现网页字符定位的方法
2015/07/14 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
谈一谈javascript中继承的多种方式
2016/02/19 Javascript
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
基于vue2实现左滑删除功能
2017/11/28 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
2020/02/23 Javascript
nginx部署多个vue项目的方法示例
2020/09/06 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
Python单链表简单实现代码
2016/04/27 Python
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
Python爬取十篇新闻统计TF-IDF
2018/01/03 Python
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
使用python来调用CAN通讯的DLL实现方法
2019/07/03 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
css3学习心得分享
2013/08/19 HTML / CSS
HTML5应用之文件上传
2016/12/30 HTML / CSS
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
Html5 webRTC简单实现视频调用的示例代码
2020/09/23 HTML / CSS
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
运动员获奖感言
2014/08/15 职场文书
年终晚会活动方案
2014/08/21 职场文书
乡领导班子四风问题对照检查材料
2014/09/25 职场文书
幼儿园三八妇女节活动总结
2015/02/06 职场文书
销售内勤岗位职责
2015/02/10 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
用PYTHON去计算88键钢琴的琴键频率和音高
2022/04/10 Python
让JavaScript代码更加精简的方法技巧
2022/06/01 Javascript