Multithreading 基于网络的消息传递程序的同时输入和输出
在python中,我创建了一个消息系统,其中客户端和服务器可以同时来回发送消息。以下是我的客户代码: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(
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()