Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 基于网络的消息传递程序的同时输入和输出_Multithreading_Sockets_Python 3.x - Fatal编程技术网

Multithreading 基于网络的消息传递程序的同时输入和输出

Multithreading 基于网络的消息传递程序的同时输入和输出,multithreading,sockets,python-3.x,Multithreading,Sockets,Python 3.x,在python中,我创建了一个消息系统,其中客户端和服务器可以同时来回发送消息。以下是我的客户代码: import threading import socket # Global variables host = input("Server: ") port = 9000 buff = 1024 # Create socket instance s = socket.socket() # Connect to server s.connect( (host, port) ) print(

在python中,我创建了一个消息系统,其中客户端和服务器可以同时来回发送消息。以下是我的客户代码:

import threading
import socket

# Global variables
host = input("Server: ")
port = 9000
buff = 1024

# Create socket instance
s = socket.socket()

# Connect to server
s.connect( (host, port) )
print("Connected to server\n")


class Recieve(threading.Thread):
    def run(self):
        while True: # Recieve loop
            r_msg = s.recv(buff).decode()
            print("\nServer: " + r_msg)

recieve_thread = Recieve()
recieve_thread.start()

while True: # Send loop
    s_msg = input("Send message: ")

    if s_msg.lower() == 'q': # Quit option
        break

    s.send( s_msg.encode() )

s.close()
我在后台有一个线程来检查服务器消息,还有一个循环输入来向服务器发送消息。当服务器发送一条消息,用户输入立即被反弹,为服务器消息腾出空间时,问题就出现了。我希望这样,输入保持固定在shell窗口的底部,而输出从第二行向上打印,第一行保持不变。有人告诉我,你可以使用诅咒或队列来实现这一点,但我不确定哪一个在我的情况下是最好的,也不知道如何在我的项目中实现这些模块

任何帮助都将不胜感激。多谢各位

我想要它,以便输入保持固定在外壳底部 窗口,当输出从第二行打印时,保留 只有第一行。我听说你可以使用诅咒

下面是使用的客户端代码的补充版本

它更改滚动区域以省去屏幕的底线,临时进入滚动区域以输出服务器消息,最后将其更改回原来的位置

import threading
import socket

# Global variables
host = input("Server: ")
port = 9000
buff = 1024

# Create socket instance
s = socket.socket()

# Connect to server
s.connect( (host, port) )
print("Connected to server\n")

import sys
write = sys.stdout.buffer.raw.write
from curses import *
setupterm()
lines = tigetnum('lines')
change_scroll_region = tigetstr('csr')
cursor_up            = tigetstr('cuu1')
restore_cursor       = tigetstr('rc')
save_cursor          = tigetstr('sc')

def pin(input_lines):   # protect input_lines at the bottom from scrolling
        write(save_cursor + \
              tparm(change_scroll_region, 0, lines-1-input_lines) + \
              restore_cursor)

pin(1)

class Recieve(threading.Thread):
    def run(self):
        while True: # Recieve loop
            r_msg = s.recv(buff).decode()
            write(save_cursor+cursor_up)
            print("\nServer: " + r_msg)
            write(restore_cursor)

recieve_thread = Recieve()
recieve_thread.daemon = True
recieve_thread.start()

while True: # Send loop
    s_msg = input("Send message: ")

    if s_msg.lower() == 'q': # Quit option
        break

    s.send( s_msg.encode() )

pin(0)
s.close()