#服务器端
#==========================================================
#导入模块import socketimport threadingimport re#设置全局变量flagflag = 0#设置离线消息列表msg_list = []#创建udp套接字udp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)#绑定ip端口udp_server_socket.bind(("", 5858))while True: # 接收来自双方的消息 msg, ip_port = udp_server_socket.recvfrom(1024) # 解析双方的ip和端口 print("消息来自:", ip_port[0], "端口:", ip_port[1]) #判断是否已给ip_port1赋值 if flag == 0: ip_port1 = ip_port flag = 1 else: #如果已经赋值,则判断本次获得的ip和端口是否和ip_port1相同,不同则赋值给ip_port2 if ip_port != ip_port1: ip_port2 = ip_port for msg_data in msg_list: print(msg_data) udp_server_socket.sendto(msg_data, ip_port2) break else: udp_server_socket.sendto("对方不在线,本次消息将转为离线消息!".encode(‘gbk‘), ip_port) msg_list.append(msg) print(msg_list) #循环接收while True: #接收消息 msg, ip_port = udp_server_socket.recvfrom(1024) # 获取消息来源的ip和端口 print("消息来自:", ip_port[0], "端口:", ip_port[1]) #判断消息内容,不符合法规进行过滤 msg1 = re.sub("坏","好",msg.decode(‘gbk‘)) msg = msg1.encode(‘gbk‘) # 给双方回复消息 if ip_port == ip_port1: udp_server_socket.sendto(msg, ip_port2) if ip_port == ip_port2: udp_server_socket.sendto(msg, ip_port1)
#客户端
#==========================================================
"""UDP聊天器多任务版(两个子线程)"""#导入多线程及套接字模块import socketimport threadingimport sys #创建客户端类class UdpClient(object): #创建init方法,初始化变量 def __init__(self): # 创建udp套接字 self.udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.params = int(sys.argv[1]) #创建接收方法 def recv_msg(self,current_socket): #循环接收消息并显示 while True: #接收数据 recv_data,ip_port = current_socket.recvfrom(1024) #转码 recv_message = recv_data.decode(‘gbk‘) #输出 print("\n\t\t\t",recv_message,"\n") #创建发送方法 def send_msg(self,current_socket): # 循环发送用户输入的消息 while True: # 获取用户输入的内容 send_msg = input("输入的消息") + "\n" # 转码 send_data = send_msg.encode(‘gbk‘) # 发送二进制数据 current_socket.sendto(send_data, ("127.0.0.1", self.params)) def run(self): # 向服务器发送hello包,让服务器找到我 self.udp_socket.sendto("".encode(‘gbk‘), ("127.0.0.1", 5858)) # 创建接收消息的子线程 recv_thread = threading.Thread(target=self.recv_msg, args=(self.udp_socket,)) send_thread = threading.Thread(target=self.send_msg, args=(self.udp_socket,)) # 启动接收消息子线程 recv_thread.start() send_thread.start() send_thread.join() recv_thread.join() # 关闭套接字 self.udp_socket.close()clientA = UdpClient()clientA.run()
原文地址:https://www.cnblogs.com/sunmingduo/p/10219127.html
时间: 2024-10-11 17:54:04