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()