UDP聊天器 伺服器版 支援離線訊息 支援淨網過濾
阿新 • • 發佈:2019-01-04
#伺服器端
#==========================================================
#匯入模組
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("\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()