#服务器端
#==========================================================
#导入模块
import socket
import threading
import re
#设置全局变量flag
flag = 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 socket
import threading
import 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(" ",recv_message," ")
#创建发送方法
def send_msg(self,current_socket):
# 循环发送用户输入的消息
while True:
# 获取用户输入的内容
send_msg = input("输入的消息") + " "
# 转码
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()