问题
I am implementing a chat server, and I currently have a list of client sockets I'd like to send information through, the issue is that the client exists in a raw_input() state in order to send the message to be relayed through the server, and each client's buffer is being filled up until that client itself enters something in the raw_input() field, at which point it prints its receive buffer as a single line chunk.
I would like each client to get an immediate display of what's in their buffer, even though they are stuck inside of raw_input().
Here is my output:
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>
and my actual code:
cli1 = cli2:
from socket import *
from threading import Thread
import sys
def iamclient():
message = raw_input("Your Message: ")
s.send(message)
reply = s.recv(1024) # 1024 is max data that can be received
print "Received ", repr(reply)
HOST = ''
PORT = 8003
s = socket(AF_INET, SOCK_STREAM)
try:
s.connect((HOST, PORT)) # client-side, connects to a host
except:
print 'Max capacity reached, try again later'
s.close()
sys.exit()
Thread(target=iamclient).start()
while True:
iamclient()
s.close()
server.py
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()
回答1:
Since (as @thefourtheye said) raw_input
is an I/O block on the main thread, so you need to create a separate thread to print messages.
Multithreading solution:
>>> 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
Use a separate Thread
for receiving and printing messages.
来源:https://stackoverflow.com/questions/22240533/display-output-while-inside-of-raw-input