-
Notifications
You must be signed in to change notification settings - Fork 0
/
mychat_server.py
103 lines (90 loc) · 3.57 KB
/
mychat_server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import socket
from user_manager import UserManager
#服务器的IP和端口
server_addr = ("192.168.53.9",4080)
# 服务端程序,接收用户请求,做相关处理
class MyChatServer:
def __init__(self):
self.__socket = self.init_socket()
# 用户管理器
self.__user_manager = UserManager()
@staticmethod
# 配置并返回socket
def init_socket():
global server_addr
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(server_addr)
return s
# 启动函数
def start(self):
self.run()
# 监听客户端发来的请求
def run(self):
while True:
data, addr = self.__socket.recvfrom(1024)
# 根据客户端发来的数据不同,做不同的处理
# 解析data
self.respond_request(data.decode("utf-8"), addr)
# 根据客户端发来的字符串,了解客户端需求,分发处理
def respond_request(self, data, addr):
# 登陆请求 <[LOGIN]>|username
ctl = data.split("|")[0]
ctl_dict = {
"<[LOGIN]>": MyChatServer.client_login,
# 下线请求<[LOGOUT]>|username
"<[LOGOUT]>": MyChatServer.client_logout,
# 显示在线用户列表,<[SHOW_USR_LIST]>
"<[SHOW_USR_LIST]>": MyChatServer.clinent_request_usrt_list,
# 聊天 <[SEND_MESSAGE]>|fromusername|tousername|words
"<[SEND_MESSAGE]>": MyChatServer.clinet_send_message,
}
try:
ctl_dict[ctl](self, data, addr)
except KeyError:
print("KeyError")
# 客户端登陆处理
def client_login(self, data, addr):
# 登陆请求 <[LOGIN]>|username
username = data[10:]
ret = self.__user_manager.login_user(username,addr)
if ret:
# 登陆成功
print("【{}】登陆成功".format(username))
# 发一个回执
content = "<[LOGIN_SUCCESS]>"
self.__socket.sendto(content.encode("utf-8"), addr)
else:
# 登陆失败
print("【{}】登陆失败")
# 发一个回执
content = "<[LOGIN_FAILED]>"
self.__socket.sendto(content.encode("utf-8"), addr)
# 客户端下线处理
def client_logout(self,data,addr):
username = data[11:]
ret = self.__user_manager.logout_uaer(username)
if ret:
print("【{}】已下线".format(username))
content = "<[LOGOUT_SUCCESS]>"
self.__socket.sendto(content.encode("utf-8"),addr)
# 客户端请求在线用户列表
def clinent_request_usrt_list(self,data,addr):
content = "<[USR_LIST]>|" + self.__user_manager.get_username_list()
self.__socket.sendto(content.encode("utf-8"),addr)
print("发送了请求的在线用户to【{}】".format(data[18:]))
#转发客户端的聊天信息
def clinet_send_message(self,data,addr):
# 聊天 <[SEND_MESSAGE]>|fromusername|tousername|words
ls = data.split("|")
# 通过usermanager 找到 tousername的 addr
to_addr = self.__user_manager.get_user_addr(ls[2])
if not to_addr:
# 发送回执
content = "<[SEND_MESSAGE_FAILED]>|目标用户不存在"
self.__socket.sendto(content.encode("utf-8"),addr)
return
# 将信息发送给目标用户
self.__socket.sendto(data.encode("utf-8"), to_addr)
print("【{}】向【{}】发送了信息({})".format(ls[1],ls[2],ls[-1]))
chat_server = MyChatServer()
chat_server.start()