Python学习日志——UDP套接字使用

Posted SaltFishYe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习日志——UDP套接字使用相关的知识,希望对你有一定的参考价值。

UDP的通信双方也分为客户端和服务器,但是在个人理解中这方面UDP并没有严格区分,发送请求的为客户端,响应请求的为服务端。

要在python中使用udp首先要先导入socket

 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

上述例子中便创建了一个ipv4、udp套接字,

其中socket.AF_INET为ipv4型,socket.AF_INET6为ipv6型;

socket.SOCK_DGRAM为udp协议,socket.SOCK_STREAM为tcp协议

然后要绑定地址(127.0.0.1为本地ip地址)

host = ‘127.0.0.1‘
port = 7788
s.bind((host, port))

如此绑定了ip地址和端口号,若port端口号缺省,则系统默认分配一个端口给此socket,推荐使用缺省port绑定地址,因为这样能不避免端口冲突。

data=b‘Hello!‘
s.sendto(data,(‘127.0.0.1,9999‘))

向127.0.0.1端口9999发送数据Hello!

接受数据

while True:
    data, addr = s.recvfrom(1024)

接收数据用套接字的recvfrom方法参数值为每次接受多少字节数据,上述例子中为每次接受1024自己数据,因为并不是每次都能一次接受完所有数据,所有放在循环中。

一般情况下,像是上例的循环接受数据,会约定一个协议,接受什么样的数据就结束循环,上例中并没有写出。

接受的数据有两个值,data为对方想要发送的数据,addr为对方的地址 

注意:

发送和接受的数据是字节流,注意编码和解码。

 

广播

因为UDP的性质,就是向一个地址发包,其他就不管了,并不需要连接,所以有广播的用法(具体还涉及ip相关知识,这里不做详解)

广播的分组传送给host ID段所涉及的所有计算机。例如,对于10.1.1.0 (255.255.255.0 )网段,其广播地址为10.1.1.255 (255 即为2 进制的11111111 )

#dest = (‘192.168.1.255‘,7788)
#要是广播地址不在dest上,便无法使用
#<broadcast>自动获得当前广播地址
dest = (‘<broadcast>‘,7788)
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#要发送广播,这句必须有
s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)

之后发送数据如常  

 

待续

 

以上是关于Python学习日志——UDP套接字使用的主要内容,如果未能解决你的问题,请参考以下文章

Python3.x基础学习-UDP和TCP用法

4月23日 python学习总结 套接字UDP和 操作系统理论,多道理论

Python学习笔记九(UDP套接字和并发编程)

Python学习之——Socket套接字(UDP连接)

Python学习-udp

python UDP套接字客户端recevfrom非常慢