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 需要在他们看到消息之前输入一些内容,因此同时不完全是期望的行为。

输入调用的问题在于它一直处于阻塞状态,直到有人按下回车键。因此,对于您的程序,它也无法检测您是在写消息还是打印某些内容是否安全。您可以通过直接读取键盘来解决这个问题。

关于这一点,使用用户界面实际执行此操作可能更容易:有一个文本框用于接收文本,一个文本框用于发送文本。尝试在命令行程序中解决这个问题可能会给您带来不必要的困难。