python的sendto_UDP收发的Python实现(代码与代码分析),发送,接收,以及

1 UDP

UDP是一个

无连接

的传输协议。UDP作为网络主要传输协议之一,其优势在于

速度快

(这里的速度快指的是

不需要进行连接所节省的时间

),支持广播和多播。但是相对的,UDP所

传输信息

安全都需要应用层来保障

,例如:自定义出错重传,自定义的流量控制。某种程度上说,UDP赋予了应用层极大的自由可以自定义规则。

使用Python实现UDP的发送与接收,第一步需要的就是导入 Socket 包,并实例化一个Socket对象。

导入Socket 包 :

import socket

实例化 Socket 对象 :

注意:

由于使用UDP,所以在socket()函数的第二个参数应为socket.SOCK_DGRAM 这个参数表示创建的是一个UDP对象。

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

1.1 UDP发送

1.1.1 bind() 绑定IP与端口号

通过Python可以使用固定或不固定端口发送UDP数据。

如果希望固定端口发送UDP,就需要** bind() **函数绑定端口号和IP

Udp_Socket.bind(("127.0.0.1",9090))

如果不需要绑定,系统自动以随机分配的端口发送。

1.1.2 sendto() 发送函数

UDP 相比 TCP 少了许多的步骤与过程,所以直接调用 sendto() 发送函数就可以将需要发送的数据发送至指定IP与端口号。

sendto () :

Udp_Socket.sendto("hello world".encode("gbk"),('127.0.0.1',8080))

需要注意的是:

相比于TCP的send()发送,UDP的发送函数sendto()

多了一 个to

,也就是

需要指定发送的位置

TCP由于需要先连接后发送或接收所以只要连接成功就可以直接发送或接收而无需指定发送的位置。但UDP为无连接的传输,所以需要在每次发送时指定发送位置。

encode(“gbk”): 这个函数是将你需要发送的数据转为gbk(windows 操作系统的文字编码)编码。

(‘127.0.0.1’,8080):这个就是所要发送的位置的IP与端口号。

1.1.3 close()关闭

在发送过后就可以使用close()关闭 socket

Udp_Socket.close()

1.1.4 UDP发送完整代码

通过循环读取键盘输入,发送数据。当键盘输入 EXIT 时程序结束。

mport socket

def main():

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

localaddr = ("127.0.0.1",9090)

Udp_Socket.bind(localaddr)

while True:

send_data = input("请输入发送的数据")

if send_data == "EXIT":

break

Udp_Socket.sendto(send_data.encode("gbk"),('127.0.0.1',8080))

send_data = ""

Udp_Socket.close()

if __name__ == "__main__":

main()

1.2 UDP接收端

1.2.1 bind() 绑定IP与端口号

既然是 接收端那么必定需要知道从哪里接收,所以一定需要绑定IP与端口号

__bind(): __

Udp_Socket.bind(("127.0.0.1",9090))

1.2.2 recvform() 接收

在绑定了端口号之后,就可以接收发送到该端口的数据。这时通过recvform()接收,recvform()相比TCP协议中的接收多了一个form这也就是说明它的返回值中应该多了一些,多的东西就是发送者的地址。

这个recvform()函数的返回值是(data,address)

通过使用Recv_Data[0]的方式获取其中的数据部分。

通过使用Recv_Data[1]的方式获取其中的地址部分。

Recv_Data = udp_socket.recvfrom(1024)

Recv_Data = Recv_Data[0]

Sender_Addr = Recv_Data[1]

print("%s:%s"%(str(Sender_Addr),Recv_Msg.decode("gbk")))

1.2.3 UDP接收完整代码

import socket

def main():

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

Udp_Socket.bind(("127.0.0.1",9090))

Recv_Data = Udp_Socket.recvfrom(1024)

Recv_Msg = Recv_Data[0]

Sender_Addr = Recv_Data[1]

print("%s:%s"%(str(Sender_Addr),Recv_Msg.decode("gbk")))

if __name__ == "__main__":

main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值