我尝试用python在两台计算机之间进行聊天,没有什么特别的,只是使用命令提示符行。在
现在服务器端的代码如下所示:
import socket
import threading
import time
def socket_create():
try:
global host
global port
global s
host = #Some IP
port = 9998
s = socket.socket()
except socket.error as msg:
print(msg)
def socket_bind():
try:
global port
global host
global s
print("Binding socket to port: " + str(port))
s.bind((host ,port))
s.listen(4)
except socket.error as msg:
print(msg)
socket_bind
def socket_accept():
global conn
conn, address = s.accept()
print("Connection with" + address[0] + str(address[1]))
t1 = threading.Thread(target = receive_message)
t2 = threading.Thread(target = send_message)
t1.daemon = True
t2.daemon= True
t1.start()
t2.start()
def send_message():
global conn
time.sleep(1)
while True:
print(2)
send_msg = input("You>")
if send_msg != b'':
conn.send(str.encode(send_msg))
print("msg sent")
def receive_message():
global conn
time.sleep(0.5)
while True:
receive_msg = conn.recv(2048)
print("Him>" + receive_msg.decode())
def main():
global conn
socket_create()
socket_bind()
socket_accept()
main()
客户端的代码如下所示:
^{pr2}$现在我遇到的问题是,当一个人在打字时,从另一方收到一条信息,它就会把它写在输入上。在
例如,当我忙着输入“Hey have you finis”并收到一条类似“Hey have you finishe”的消息时,它看起来像是“Hey have you finisHey”。在
我试着用'\n'把它打印到新的行上,但那也不起作用,因为那样我就得从头开始打字了。在
有人有什么想法吗?在
干杯。在
这不是一件小事。在正常情况下,最简单的答案是在您希望独占使用的区域周围放置一个“锁”(多线程原语)。例如,你可以在打印的地方加锁,在你请求输入的地方加锁。在
在您的情况下,这可能会在某种程度上起作用,它应该会使“接收”消息停止打印,直到您键入某些内容。对于接收者来说,他/她需要在看到消息之前输入一些内容,因此同时也不是完全期望的行为。在
输入调用的问题是它一直阻塞,直到有人点击enter。因此,对于你的程序来说,它也无法检测到,如果你正在写一条消息,或者是否可以安全地打印某些内容。你可以直接读键盘来解决这个问题。在
在这一点上,使用一个用户界面可能更容易做到这一点:有一个文本框用于接收文本,一个文本框用于发送文本。试图在命令行程序中解决这个问题可能会给您带来不必要的困难。在
相关问题 更多 >
编程相关推荐