在raw_input()内部时显示输出 [英] Display output while inside of raw_input()

查看:97
本文介绍了在raw_input()内部时显示输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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.

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

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().

这是我的输出:

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.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>

和我的实际代码:

cli1 = cli2:

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

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()

推荐答案

由于(如@thefourtheye所说)raw_input是主线程上的I/O块,因此您需要创建一个单独的线程来打印消息.

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.

多线程解决方案:

>>> 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

使用单独的Thread接收和打印消息.

Use a separate Thread for receiving and printing messages.

这篇关于在raw_input()内部时显示输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆