问题描述
我在python中有一个服务器和客户端脚本,该脚本利用套接字进行选择,脚本允许客户端在本地服务器上相互发送消息,问题是您必须在代码更新之前发送消息,并且使您可以接收其他人发送的消息。我尝试实现按键操作,例如按“ c”进行聊天(然后在等待输入时接收代码将不断运行),但是当一个用户单击“ c”时,服务器上的每个人都进入了聊天模式,从而破坏了整个目的。以下是一些摘要:
客户端:
def chat():
return input(f"{my_username} > ")
while True:
# message = input(f"{my_username} > ")
if keyboard.is_pressed('c'): # if key 'c' is pressed then enter chat mode
print('\nChat mode active!')
message = chat() # Now gets user input
else:
message = "" # otherwise send an empty message (which translates to 'update the code')
if message: # if message is not empty
message = message.encode("utf-8")
message_header = f"{len(message):<{HEADER_LENGTH}}".encode("utf-8")
client_socket.send(message_header + message)
try:
while True:
# receive messages
username_header = client_socket.recv(HEADER_LENGTH)
if not len(username_header): # didn't receive any data
print("Connection closed by server")
sys.exit()
username_length = int(username_header.decode("utf-8").strip())
username = client_socket.recv(username_length).decode("utf-8")
message_header = client_socket.recv(HEADER_LENGTH)
message_length = int(message_header.decode("utf-8").strip())
message = client_socket.recv(message_length).decode("utf-8")
print(f"{username} > {message}")
// a bunch of exception blocks follows this
然后您有一些服务器代码:
while True:
read_sockets,_,exception_sockets = select.select(sockets_list,[],sockets_list)
for notified_socket in read_sockets:
if notified_socket == server_socket: # if someone just connected
client_socket,client_address = server_socket.accept()
user = receive_message(client_socket)
if not user:
continue
sockets_list.append(client_socket)
clients[client_socket] = user
print(f"Accepted new connection from {client_address[0]}:{client_address[1]}. Username: {user['data'].decode('utf-8')}")
else:
message = receive_message(notified_socket)
if not message:
print(f"Closed connection from {clients[notified_socket]['data'].decode('utf-8')}")
sockets_list.remove(notified_socket)
del clients[notified_socket]
continue
user = clients[notified_socket]
print(f"Received message from {user['data'].decode('utf-8')}: {message['data'].decode('utf-8')}")
for client_socket in clients:
# we do not want to echo the message back to the sender
if client_socket != notified_socket:
client_socket.send(user['header'] + user['data'] + message['header'] + message['data'])
for notified_socket in exception_sockets:
sockets_list.remove(notified_socket)
del clients[notified_socket]
我刚刚开始学习套接字,所以我不确定如何将客户端100分开,因此,如果一个客户端按下“ c”键进入聊天模式,则其他所有客户端都会收到相同的消息,说他们是在聊天中更多,并且可以开始发送消息(如图所示)
两个客户端收到相同的“ c”按键信号
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)