-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.py
108 lines (100 loc) · 5.37 KB
/
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
104
105
106
107
108
import socket
import threading
from database import ChatLogs, User_info, Friend_list
from message import Message
cmd = ['password', 'friends', 'register']
class Server(object):
def __init__(self, ip, port):
self.ip = ip
self.port = port
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.bind((ip, port))
self.chat_logs = ChatLogs('chat_logs.csv')
self.log_in = User_info('user_info.csv')
self.friend_list = Friend_list('friend_list.csv')
self.msg = Message('server')
self.clients = []
self.need_update = True
def handle_client(self, client_socket, client_address):
print("连接来自:", client_address)
client_name = ':'.join(str(item) for item in client_address)
this_msg = Message(client_name)
land_error_time = 1
try:
while True:
if land_error_time > 5: # 密码输错5次就关闭链接
client_socket.sendall(self.msg.en_code('password', client_name, '密码错误!!!'))
client_socket.close()
break
received_data = client_socket.recv(1024).decode()
received_data = [data for data in received_data.split('\r\n\r\n') if data]
for pack in received_data:
this_msg.de_code(pack)
if this_msg.receiver == 'password': # 登陆密码判定
result = self.log_in.get_user(this_msg.sender, this_msg.content)
if result:
self.need_update = True
client_name = this_msg.sender
self.clients.append([client_socket, this_msg.sender])
else:
land_error_time = land_error_time + 1
print('{}时刻{}使用密码{}'.format(this_msg.time, this_msg.sender, this_msg.content))
client_socket.sendall(self.msg.en_code('password', client_name, str(result)))
elif this_msg.receiver == 'register':
id_name = this_msg.sender
pwd = this_msg.content
user_id, user_name = id_name.split("@")[0], id_name.split("@")[1]
result = self.log_in.ID_check(user_id)
if result:
self.log_in.insert_user(user_id, user_name, pwd)
self.log_in = User_info('user_info.csv')
else:
print("register fail!")
client_socket.sendall(self.msg.en_code('register', client_name, str(result)))
elif this_msg.receiver == 'offline':
self.clients = [client for client in self.clients if client[1] != this_msg.content]
else: # 发送消息
friends = [itm[1] for itm in self.clients]
tmp_msg = '\r'
for friend in friends:
tmp_msg = tmp_msg + friend + '\r'
for client in self.clients:
client_socket.sendall(self.msg.en_code('friends', client[1], tmp_msg))
print('向{}发送在线人员信息'.format(client[1]))
print('{}时刻{}向{}发送{}'.format(this_msg.time, this_msg.sender,
this_msg.receiver, this_msg.content))
self.chat_logs.insert_message(this_msg.sender, this_msg.receiver, this_msg.content,
this_msg.time)
self.chat_logs = ChatLogs('chat_logs.csv')
if this_msg.receiver == '0': # 群发消息
for client in self.clients:
if client[1] != this_msg.sender:
client[0].sendall(self.msg.en_code(this_msg.sender,
client[1], this_msg.content))
else: # 私聊发送
for client in self.clients:
if client[1] == this_msg.receiver:
client[0].sendall(self.msg.en_code(this_msg.sender,
this_msg.receiver, this_msg.content))
break
except Exception as e:
print("Error:", e)
self.clients = [client for client in self.clients if client[1] != client_name]
client_socket.close()
finally:
# 关闭客户端连接
client_socket.close()
def listen(self):
self.server_socket.listen(5)
try:
while True:
client_socket, client_address = self.server_socket.accept()
client_thread = threading.Thread(target=self.handle_client, args=(client_socket, client_address))
client_thread.start()
except KeyboardInterrupt:
print('服务器停止运行')
finally:
self.server_socket.close()
if __name__ == '__main__':
server = Server('192.168.86.115', 8989)
server.listen()