簡體   English   中英

Python如何在cmd中停止打印和輸入的干擾?

[英]Python how to stop the interference of a print and input in cmd?

我正在嘗試使用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()

而客戶端的代碼如下所示:

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'將其打印在新行上,但是那也不起作用,因為那樣的話我必須重新開始鍵入所有內容。

有人有想法么?

干杯。

解決這個問題並非微不足道。 在正常情況下,最簡單的答案是在您要排他使用的區域周圍放置一個“鎖”(多線程基元)。 例如,您可以在打印位置周圍放置一個鎖,並在請求輸入的位置周圍放置一個鎖。

在您的情況下,這可能會在一定程度上起作用,這應該使“接收”消息停止打印,直到您鍵入內容為止。 對於收件人,他(她)需要先鍵入一些內容,然后他們才能看到消息,因此與此同時,這並不是完全理想的行為。

輸入呼叫的問題在於它一直阻塞直到有人擊中進入。 因此,對於您的程序,它是否也無法檢測,是否正在編寫消息或是否可以安全打印某些內容。 您可以通過直接閱讀鍵盤來解決該問題。

關於這一點,使用用戶界面實際執行此操作可能會更容易:有一個文本框用於接收文本,一個文本框用於發送文本。 嘗試在命令行程序中解決此問題可能會給您帶來不必要的麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM