88
99# Client class
1010class Client :
11+ # 初始化函数,创建一个socket,用于客户端,创建一个字符串,用于存储客户端的昵称
1112 def __init__ (self , sock , addr ):
1213 self .socket = sock
1314 self .addr = addr
@@ -16,6 +17,7 @@ def __init__(self, sock, addr):
1617
1718# Chat class
1819class Chat :
20+ # 初始化函数,创建一个字典,用于存储客户端,创建一个socket,用于服务器,绑定服务器地址和端口,创建一个列表,用于存储客户端的socket
1921 def __init__ (self ):
2022 self .clients = {}
2123 self .server_socket = socket .socket (socket .AF_INET , socket .SOCK_STREAM )
@@ -24,6 +26,7 @@ def __init__(self):
2426 self .server_socket .listen (511 )
2527 self .client_sockets = [self .server_socket ]
2628
29+ # 添加客户端函数,将客户端的socket和地址加入到字典和列表中
2730 def add_client (self , client_socket , addr ):
2831 client = Client (client_socket , addr )
2932 self .clients [client_socket ] = client
@@ -33,6 +36,7 @@ def add_client(self, client_socket, addr):
3336 client_socket .send (welcome_msg .encode ())
3437 print (f"Connected client { addr [1 ]} " )
3538
39+ # 删除客户端函数,将客户端的socket和地址从字典和列表中删除
3640 def remove_client (self , client_socket ):
3741 print (
3842 f"Disconnected client { self .clients [client_socket ].addr [1 ]} , nick={ self .clients [client_socket ].nick } "
@@ -42,20 +46,29 @@ def remove_client(self, client_socket):
4246
4347 def run (self ):
4448 while True :
49+ # 使用select函数,监听客户端socket,如果有客户端socket有数据发送过来,就将其加入到rlist列表中
4550 rlist , _ , _ = select .select (self .client_sockets , [], [], 1 )
4651
52+ # 遍历rlist列表,处理客户端socket发送过来的数据
4753 for ready_socket in rlist :
54+ # 如果是服务器socket,说明有新的客户端连接,调用add_client函数,将其加入到字典和列表中
4855 if ready_socket == self .server_socket :
4956 client_socket , addr = self .server_socket .accept ()
5057 self .add_client (client_socket , addr )
58+ # 如果不是服务器socket,说明是已经连接的客户端发送数据过来,调用recv函数接收数据
5159 else :
5260 try :
61+ # 接收数据,最大长度为256字节
5362 data = ready_socket .recv (256 )
63+ # 如果接收到的数据为空,说明客户端已经断开连接,调用remove_client函数,将其从字典和列表中删除
5464 if not data :
5565 self .remove_client (ready_socket )
66+ # 如果接收到的数据不为空,说明客户端发送了数据过来,将其发送给其他客户端
5667 else :
68+ # 获取发送数据的客户端的昵称
5769 client = self .clients [ready_socket ]
5870
71+ # 如果发送的数据以"/"开头,说明是命令,将其解析
5972 if data [0 ] == b"/" :
6073 args = data .decode ()[1 :].split (" " )
6174 cmd = args [0 ]
@@ -65,10 +78,12 @@ def run(self):
6578 errmsg = "Unsupported command\n "
6679 ready_socket .send (errmsg .encode ())
6780
81+ # 如果发送的数据不是以"/"开头,说明是聊天信息,将其发送给其他客户端
6882 else :
6983 msg = f"{ client .nick } > { data .decode ()} " .encode ()
7084 print (msg .decode (), end = "" )
7185
86+ # 遍历客户端的socket,将消息发送给其他客户端
7287 for sock in self .clients :
7388 if sock != ready_socket :
7489 sock .send (msg )
0 commit comments