python实现UDP通信

UDP,用户数据报传输协议,它位于TCP/IP协议的传输层,是一种无连接的协议,它发送的报文不能确定是否完整地到达了另外一端。UDP广泛应用于需要相互传输数据的网络应用中,如QQ使用的就是UDP协议。在网络质量不好的情况下,使用UDP协议时丢包现象十分严重,但UDP占用资源少,处理速度快,UDP依然是传输数据时常用的协议。

下面是用python实现UDP服务器的代码(基于python2.X):

 

[python] view plain copy

  1. #!/usr/bin/env python  
  2. import socket  
  3. address=('127.0.0.1',10000)  
  4. s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  
  5. s.bind(address)  
  6. while 1:  
  7.     data,addr=s.recvfrom(2048)  
  8.     if not data:  
  9.         break  
  10.     print "got data from",addr  
  11.     print data  
  12. s.close()  

 

UDP客户端的代码:

[cpp] view plain copy

  1. #!/usr/bin/env python  
  2. import socket  
  3. addr=('127.0.0.1',10000)  
  4. s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  
  5. while 1:  
  6.     data=raw_input()  
  7.     if not data:  
  8.         break  
  9.     s.sendto(data,addr)  
  10. s.close()  

运行这两个程序,会显示以下结果:

服务器端:

客户端:

 

UDP的应用

在局域网中,如果要想局域网内所有计算机发送数据,可以使用广播,广播不能用TCP实现,可以用UDP实现,接受方收到广播数据后,如果有进程在侦听这个端口,就会接收数据,如果没有进程侦听,数据包会被丢弃。

广播的发送方:

[cpp] view plain copy

  1. #!usr/bin/env python  
  2. import socket  
  3. host=''  
  4. port=10000  
  5. s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  
  6. s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)  
  7. s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)  
  8. s.bind((host,port))  
  9. while 1:  
  10.     try:  
  11.         data,addr=s.recvfrom(1024)  
  12.         print "got data from",addr  
  13.         s.sendto("broadcasting",addr)  
  14.         print data  
  15.     except KeyboardInterrupt:  
  16.         raise  

广播的接收方:

[cpp] view plain copy

  1. #!/usr/bin/env python  
  2. import socket,sys  
  3. addr=('<broadcast>',10000)  
  4. s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  
  5. s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)  
  6. s.sendto("hello from client",addr)  
  7. while 1:  
  8.     data=s.recvfrom(1024)  
  9.     if not data:  
  10.         break  
  11.     print data  

运行广播程序,发送端会显示以下结果:

got data from (‘<地址>’,<端口号>)

hello fromclient

接收端会显示以下结果:

(‘broadcasting’,(<IP地址>,10000))

########################3

转自:https://blog.csdn.net/u011608357/article/details/19776405

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值