UDP,用户数据报传输协议,它位于TCP/IP协议的传输层,是一种无连接的协议,它发送的报文不能确定是否完整地到达了另外一端。UDP广泛应用于需要相互传输数据的网络应用中,如QQ使用的就是UDP协议。在网络质量不好的情况下,使用UDP协议时丢包现象十分严重,但UDP占用资源少,处理速度快,UDP依然是传输数据时常用的协议。
下面是用python实现UDP服务器的代码(基于python2.X):
[python] view plain copy
- #!/usr/bin/env python
- import socket
- address=('127.0.0.1',10000)
- s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
- s.bind(address)
- while 1:
- data,addr=s.recvfrom(2048)
- if not data:
- break
- print "got data from",addr
- print data
- s.close()
UDP客户端的代码:
[cpp] view plain copy
- #!/usr/bin/env python
- import socket
- addr=('127.0.0.1',10000)
- s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
- while 1:
- data=raw_input()
- if not data:
- break
- s.sendto(data,addr)
- s.close()
运行这两个程序,会显示以下结果:
服务器端:
客户端:
UDP的应用
在局域网中,如果要想局域网内所有计算机发送数据,可以使用广播,广播不能用TCP实现,可以用UDP实现,接受方收到广播数据后,如果有进程在侦听这个端口,就会接收数据,如果没有进程侦听,数据包会被丢弃。
广播的发送方:
[cpp] view plain copy
- #!usr/bin/env python
- import socket
- host=''
- port=10000
- s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
- s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
- s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
- s.bind((host,port))
- while 1:
- try:
- data,addr=s.recvfrom(1024)
- print "got data from",addr
- s.sendto("broadcasting",addr)
- print data
- except KeyboardInterrupt:
- raise
广播的接收方:
[cpp] view plain copy
- #!/usr/bin/env python
- import socket,sys
- addr=('',10000)
- s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
- s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
- s.sendto("hello from client",addr)
- while 1:
- data=s.recvfrom(1024)
- if not data:
- break
- print data
运行广播程序,发送端会显示以下结果:
got data from (‘<地址>’,<端口号>)
hello fromclient
接收端会显示以下结果:
(‘broadcasting’,(,10000))
########################3
转自:https://blog.csdn.net/u011608357/article/details/19776405