Python 在原始输入()内显示输出

Python 在原始输入()内显示输出,python,sockets,client,Python,Sockets,Client,我正在实现一个聊天服务器,目前我有一个客户端套接字列表,我想通过它发送信息,问题是客户端处于raw_input()状态,以便通过服务器发送要转发的消息,并且每个客户端的缓冲区都被填满,直到该客户端本身在raw_input()中输入内容为止字段,此时它将其接收缓冲区打印为单行块 我希望每个客户机都能立即显示其缓冲区中的内容,即使它们卡在raw_input()中 以下是我的输出: cli1.py Your Message: test Your Message: Received "'test'"

我正在实现一个聊天服务器,目前我有一个客户端套接字列表,我想通过它发送信息,问题是客户端处于raw_input()状态,以便通过服务器发送要转发的消息,并且每个客户端的缓冲区都被填满,直到该客户端本身在raw_input()中输入内容为止字段,此时它将其接收缓冲区打印为单行块

我希望每个客户机都能立即显示其缓冲区中的内容,即使它们卡在raw_input()中

以下是我的输出:

cli1.py

Your Message: test
Your Message: Received  "'test'"
test
Received  "'test'"
Your Message: 
cli2.py

Your Message: test
Your Message: Received  "'test'"
1
Received  "'test''test'"
Your Message: 
server.py

Server is running......
('127.0.0.1', 58919) is Connected
('127.0.0.1', 58920) is Connected
Received Message 'test'
we have connected:  <socket._socketobject object at 0x1004b6f30>
we have connected:  <socket._socketobject object at 0x1004e98a0>
Received Message 'test'
we have connected:  <socket._socketobject object at 0x1004b6f30>
we have connected:  <socket._socketobject object at 0x1004e98a0>
Received Message 'test'
we have connected:  <socket._socketobject object at 0x1004b6f30>
we have connected:  <socket._socketobject object at 0x1004e98a0>
Received Message '1'
we have connected:  <socket._socketobject object at 0x1004b6f30>
we have connected:  <socket._socketobject object at 0x1004e98a0>
from socket import *
from threading import Thread

def clientHandler():
    conn, addr = s.accept()
    connlist.append(conn)
    print addr, "is Connected"
    while 1:
        data = conn.recv(1024)
        if not data:
            break
        print "Received Message", repr(data)
        for i in connlist:
            print "we have connected: ",i
            i.send(repr(data))


HOST = '' #localhost
PORT = 8003

s = socket(AF_INET, SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(2)

connlist = []

print "Server is running......"

#Thread(target=clientHandler).start()
#Thread(target=clientHandler).start()
#Thread(target=clientHandler).start()

for i in range(2):
    Thread(target=clientHandler).start()

s.close()
server.py

Server is running......
('127.0.0.1', 58919) is Connected
('127.0.0.1', 58920) is Connected
Received Message 'test'
we have connected:  <socket._socketobject object at 0x1004b6f30>
we have connected:  <socket._socketobject object at 0x1004e98a0>
Received Message 'test'
we have connected:  <socket._socketobject object at 0x1004b6f30>
we have connected:  <socket._socketobject object at 0x1004e98a0>
Received Message 'test'
we have connected:  <socket._socketobject object at 0x1004b6f30>
we have connected:  <socket._socketobject object at 0x1004e98a0>
Received Message '1'
we have connected:  <socket._socketobject object at 0x1004b6f30>
we have connected:  <socket._socketobject object at 0x1004e98a0>
from socket import *
from threading import Thread

def clientHandler():
    conn, addr = s.accept()
    connlist.append(conn)
    print addr, "is Connected"
    while 1:
        data = conn.recv(1024)
        if not data:
            break
        print "Received Message", repr(data)
        for i in connlist:
            print "we have connected: ",i
            i.send(repr(data))


HOST = '' #localhost
PORT = 8003

s = socket(AF_INET, SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(2)

connlist = []

print "Server is running......"

#Thread(target=clientHandler).start()
#Thread(target=clientHandler).start()
#Thread(target=clientHandler).start()

for i in range(2):
    Thread(target=clientHandler).start()

s.close()
因为(正如@thefourtheye所说)
raw\u input
是主线程上的一个I/O块,所以您需要创建一个单独的线程来打印消息

多线程解决方案:

>>> def print_message():
    time.sleep(5)
    print "message"


>>> bgThread = Thread(target=print_message)
>>> bgThread.start()
>>> x = raw_input()
message
input is entered here
>>> print x
input is entered here

使用单独的
线程
接收和打印消息

raw\u input
执行阻塞调用我该怎么办?还有什么选择?作为补充,我认为您没有正确使用
Thread
s。在您的客户机代码中,您为
iamclient()
启动一个线程以运行一次,然后再次(无线程)运行多次。