【发布时间】:2018-02-11 17:50:59
【问题描述】:
所以我正在使用 python 开发一个简单的聊天服务器。 服务器运行良好,在客户端我有一个线程用于接收传入数据和一个用于发送消息。
我可以从 client_1 向服务器发送一条消息,服务器将它传递给所有其他客户端,然后它们将打印该消息。
尽管技术上一切正常,但仍有一件事在发生时非常烦人:
假设 client_1 正在控制台中输入文本。 同时client_2向服务器发送消息,服务器将消息发送给client_1,client_1打印消息。 现在,client_1 最初输入到控制台的文本不再在它应该在的行中。
这是 client_2 发送字符串“test test”之前控制台的样子:https://ibb.co/hFdeo7
这是他们发送后的样子:https://ibb.co/mEWAvn
注意:如果我在 client_1 上按 Enter,消息“TEST TEST TEST”仍然会正确发送。问题仅在于正在打印的文本与 input() 语句中的文本之间的冲突。
我的代码如下所示:
服务器.py
connections = []
while True:
readable, writeable, exception = select.select(connections, [], [], 0)
for sock in readable:
if sock == server:
conn, addr = server.accept()
connections.append(conn)
else:
data = str(sock.recv(1024), 'utf8')
if data:
for s in connections:
if s != server_socket and s != sock:
s.send(bytes(data, 'utf8'))
else:
connections.remove(sock)
客户端.py
def receive():
while True:
readable, writeable, exception = select.select([0, client], [], [])
for sock in readable:
if sock == client:
data = str(sock.recv(1024), 'utf8')
if data:
print(data)
def send():
while True:
readable, writeable, exception = select.select([0, client], [], [])
for sock in readable:
if sock == client:
pass
else:
msg = input()
client.send(bytes(msg, 'utf8'))
Thread(target=receive).start()
Thread(target=send).start()
有没有什么办法可以解决这个问题,而不需要在单独的脚本中运行 send() 和 receive() 函数,或者使用像 Tkinter 这样的 GUI 模块?
编辑:我想在收到传入消息后立即打印,然后显示 input() 提示并在之后再次键入文本。
【问题讨论】:
-
我认为你没有说清楚的一件事是你想要在这种情况下发生什么。如果用户正在键入,客户端是否应该等待显示收到的消息?消息是否应该显示在不同的位置?是否应该打印传入的消息,然后再次显示输入提示和键入的文本?这些都是我见过的解决方案。
-
对我来说最好的办法是打印传入的消息并在之后再次显示输入提示和键入的文本。
标签: python python-3.x sockets