Python如何在cmd中停止打印和输入的干扰?

2024-04-25 14:33:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试用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'把它打印到新的行上,但那也不起作用,因为那样我就得从头开始打字了。在

有人有什么想法吗?在

干杯。在


Tags: importsendtruehostmessagebindportdef
1条回答
网友
1楼 · 发布于 2024-04-25 14:33:41

这不是一件小事。在正常情况下,最简单的答案是在您希望独占使用的区域周围放置一个“锁”(多线程原语)。例如,你可以在打印的地方加锁,在你请求输入的地方加锁。在

在您的情况下,这可能会在某种程度上起作用,它应该会使“接收”消息停止打印,直到您键入某些内容。对于接收者来说,他/她需要在看到消息之前输入一些内容,因此同时也不是完全期望的行为。在

输入调用的问题是它一直阻塞,直到有人点击enter。因此,对于你的程序来说,它也无法检测到,如果你正在写一条消息,或者是否可以安全地打印某些内容。你可以直接读键盘来解决这个问题。在

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

相关问题 更多 >