UDP的基本构造编写
前面也写过关于UDP和TCP的通信,不够都是单线程的,这一次我们想要实现同时收数据和同时发数据,就需要用到threading模块了
首先我们还是理一下编写一个UDP通信需要哪几个步骤。
比如我们想要写一个发数据的客户端。
创建UDP类型的套接字
设置目标的ip及其端口信息
将构造好的数据发送给目标
又如我们想要写一个接收数据的服务器。
创建UDP类型的套接字
设置本地IP及其端口信息
接收来自服务端的信息
好了,我们肯定知道socket是一个全双工的,所以我们不用考虑更多的事情。
那么接下来我们就可以将发送数据和接收数据的两个方法给构造出来。
首先第一步我们肯定要先做战前准备,绑定本地IP端口信息,和填写目标IP及其端口信息。
def main():
# 创建套接字
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定本地信息
ip_port_Rece = (("127.0.0.1"), 1234)
socket_UDP.bind(ip_port_Rece)
# 连接目标服务器
ip = input("请输入目标IP:")
port = int(input("请输入目标端口:"))
# 目标信息
ip_port_Send = ((ip), port)
第一步我们已经完成了,那么就可以考虑下一步了,也就是编写发送数据的方法和接收数据的方法。
def Send(socket_UDP, ip_port_Send):
while True:
data = input("请输输入你要发送的信息:")
socket_UDP.sendto(data.encode("gbk"), ip_port_Send)
def Rece(socket_UDP):
while True:
data = socket_UDP.recvfrom(1024)
"""提取数据"""
# 提取接收的信息
data_Rece = data[0].decode("gbk")
"""提取ip及端口信息"""
data_ip_port = data[1]
# 提取ip信息
ip = data_ip_port[0]
# 提取端口信息
port = data_ip_port[1]
print("[*] 来自 %s:%s 的信息为:%s" % (ip, port, data_Rece))
利用threading模块实现多任务
我们现在已经把发送和接收两个方法写出来了,接下里就是使用threading模块了,其实也很贱单,这里我就不再说threading怎么用了。
# 启用多线程
t1 = threading.Thread(target=Send, args=(socket_UDP, ip_port_Send))
t2 = threading.Thread(target=Rece, args=(socket_UDP,))
t1.start()
t2.start()
好了,接下来我们整合一下代码。
import socket
import threading
def main():
# 创建套接字
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定本地信息
ip_port_Rece = (("127.0.0.1"), 1234)
socket_UDP.bind(ip_port_Rece)
# 连接目标服务器
ip = input("请输入目标IP:")
port = int(input("请输入目标端口:"))
# 目标信息
ip_port_Send = ((ip), port)
# 启用多线程
t1 = threading.Thread(target=Send, args=(socket_UDP, ip_port_Send))
t2 = threading.Thread(target=Rece, args=(socket_UDP,))
t1.start()
t2.start()
def Send(socket_UDP, ip_port_Send):
while True:
data = input("请输输入你要发送的信息:")
socket_UDP.sendto(data.encode("gbk"), ip_port_Send)
def Rece(socket_UDP):
while True:
data = socket_UDP.recvfrom(1024)
"""提取数据"""
# 提取接收的信息
data_Rece = data[0].decode("gbk")
"""提取ip及端口信息"""
data_ip_port = data[1]
# 提取ip信息
ip = data_ip_port[0]
# 提取端口信息
port = data_ip_port[1]
print("[*] 来自 %s:%s 的信息为:%s" % (ip, port, data_Rece))
if __name__ == '__main__':
main()
我们打开我们的网络调试工具进行测试看看。