Python 如何停止cmd中打印输入的干扰?
Python how to stop the interference of a print and input in cmd?
我正在尝试使用 python 在 2 台计算机之间进行聊天,仅使用命令提示行没什么特别的。
现在服务器端的代码如下所示:
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()
而客户端的代码如下所示:
import threading
import socket
import time
s = socket.socket()
host = #SomeIP
port = 22222
s.connect((host,port))
def receive_message():
time.sleep(0.5)
while True:
print(1)
msg = s.recv(1024)
print(3)
print(msg.decode())
def send_message():
time.sleep(1)
while True:
print(2)
message = input()
s.send(str.encode(message))
t1 = threading.Thread(target = receive_message)
t2 = threading.Thread(target = send_message)
t1.daemon = True
t2.daemon = True
t1.start()
t2.start()
现在我遇到的问题是,当一个人正在打字时,从另一端收到一条消息,它会把它写在输入上。
例如,当我忙于键入 "Hey have you finis" 并收到一条消息 "Hey" 时,它看起来像这样 "Hey have you finisHey".
我试过用“\n”在新的一行上打印它,但这也不起作用,因为那时我必须重新开始输入。
有人有什么想法吗?
干杯。
这不是很容易解决。在正常情况下,最简单的答案是在您希望独占使用的区域周围放置一个 'lock'(多线程原语)。例如,您可以在打印的地方加锁,在请求输入的地方加锁。
在您的情况下,这可能会在一定程度上起作用,它应该使 'receiving' 消息停止打印,直到您键入内容。对于收件人 he/she 需要在他们看到消息之前输入一些内容,因此同时不完全是期望的行为。
输入调用的问题在于它一直处于阻塞状态,直到有人按下回车键。因此,对于您的程序,它也无法检测您是在写消息还是打印某些内容是否安全。您可以通过直接读取键盘来解决这个问题。
关于这一点,使用用户界面实际执行此操作可能更容易:有一个文本框用于接收文本,一个文本框用于发送文本。尝试在命令行程序中解决这个问题可能会给您带来不必要的困难。
我正在尝试使用 python 在 2 台计算机之间进行聊天,仅使用命令提示行没什么特别的。
现在服务器端的代码如下所示:
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()
而客户端的代码如下所示:
import threading
import socket
import time
s = socket.socket()
host = #SomeIP
port = 22222
s.connect((host,port))
def receive_message():
time.sleep(0.5)
while True:
print(1)
msg = s.recv(1024)
print(3)
print(msg.decode())
def send_message():
time.sleep(1)
while True:
print(2)
message = input()
s.send(str.encode(message))
t1 = threading.Thread(target = receive_message)
t2 = threading.Thread(target = send_message)
t1.daemon = True
t2.daemon = True
t1.start()
t2.start()
现在我遇到的问题是,当一个人正在打字时,从另一端收到一条消息,它会把它写在输入上。
例如,当我忙于键入 "Hey have you finis" 并收到一条消息 "Hey" 时,它看起来像这样 "Hey have you finisHey".
我试过用“\n”在新的一行上打印它,但这也不起作用,因为那时我必须重新开始输入。
有人有什么想法吗?
干杯。
这不是很容易解决。在正常情况下,最简单的答案是在您希望独占使用的区域周围放置一个 'lock'(多线程原语)。例如,您可以在打印的地方加锁,在请求输入的地方加锁。
在您的情况下,这可能会在一定程度上起作用,它应该使 'receiving' 消息停止打印,直到您键入内容。对于收件人 he/she 需要在他们看到消息之前输入一些内容,因此同时不完全是期望的行为。
输入调用的问题在于它一直处于阻塞状态,直到有人按下回车键。因此,对于您的程序,它也无法检测您是在写消息还是打印某些内容是否安全。您可以通过直接读取键盘来解决这个问题。
关于这一点,使用用户界面实际执行此操作可能更容易:有一个文本框用于接收文本,一个文本框用于发送文本。尝试在命令行程序中解决这个问题可能会给您带来不必要的困难。