客户端程序初步实现了用户注册、登录、发送消息、接收消息等功能,
用户验证与注册
验证用户登录
def check_user(self, user, key):
self.sk.sendall(bytes("1", "utf-8"))
self.send_string_with_length(user)
self.send_string_with_length(key)
check_result = self.recv_string_by_length(1)
return check_result == "1"
在check_user方法中,客户端首先发送请求类型“1”以表示登录请求。随后,客户端发送用户名和密码(通过send_string_with_length方法)。服务器返回一个长度为1的字符串,表示验证结果,“1”表示通过,“0”表示不通过。
注册用户
def register_user(self, user, key):
self.sk.sendall(bytes("2", "utf-8"))
self.send_string_with_length(user)
self.send_string_with_length(key)
return self.recv_string_by_length(1)
注册方法与登录类似,只是请求类型变为了“2”。同样地,客户端发送用户名和密码,并接收服务器返回的结果。“0”表示注册成功,“1”表示用户名已存在,“2”表示其他错误。
消息发送与接收
发送消息
def send_message(self, message):
self.sk.sendall(bytes("3", "utf-8"))
self.send_string_with_length(message)
发送消息的方法相对简单,首先发送请求类型“3”,然后发送消息内容。
接收消息
接收消息部分稍显复杂:
def recv_all_string(self):
length = int.from_bytes(self.sk.recv(4), byteorder='big')
b_size = 3 * 1024
times = math.ceil(length / b_size)
content = ''
for i in range(times):
if i == times - 1:
seg_b = self.sk.recv(length % b_size)
else:
seg_b = self.sk.recv(b_size)
content += str(seg_b, encoding='utf-8')
return content
在recv_all_string方法中,首先从服务器接收一个4字节的长度值,然后根据这个长度值循环接收数据块,直到完整接收所有内容。这种方法可以处理变长字符串,确保数据的完整性。
客户端功能函数
除了核心的类方法,客户端还实现了一些功能函数用于处理UI逻辑和与用户的交互:
复制代码
def send_message():
content = main_frame.get_send_text()
if content == "" or content == "\n":
print("空消息,拒绝发送")
return
main_frame.clear_send_text()
client.send_message(content)
该函数用于处理发送消息的按钮点击事件,首先获取用户输入的消息内容,如果内容为空,则拒绝发送。否则,清空输入框并调用客户端的send_message方法。
处理消息接收的线程方法
def recv_data():
time.sleep(1)
while True:
try:
_type = client.recv_all_string()
if _type == "#!onlinelist#!":
online_list = list()
for n in range(client.recv_number()):
online_list.append(client.recv_all_string())
main_frame.refresh_friends(online_list)
elif _type == "#!message#!":
user = client.recv_all_string()
content = client.recv_all_string()
main_frame.recv_message(user, content)
except Exception as e:
print("接受服务器消息出错,消息接受子线程结束。" + str(e))
break
该方法在一个独立的线程中运行,用于持续接收服务器发送的消息。根据消息类型进行不同的处理,如更新在线用户列表或显示新的聊天消息。