我想要在Python中进行双向通信:
我想绑定(bind)到一个客户端可以连接到的套接字,然后服务器和客户端可以彼此“聊天”。
我已经有了基本的监听器:
import socket
HOST='' #localhost
PORT=50008
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM ) #create an INET, STREAMing socket
s.bind((HOST,PORT)) #bind to that port
s.listen(1) #listen for user input and accept 1 connection at a time.
conn, addr = s.accept()
print "The connection has been set up"
bool=1
while bool==1:
data=conn.recv(1024)
print data
if "#!END!#" in data:
print "closing the connection"
s.close()
bool=0
我现在要执行的操作是执行一些操作,以便此脚本也可以接受用户输入,并在按下Enter键之后,将其发送回客户端。
但是我不知道该怎么做?因为如果我愿意这样做的话:
while bool==1:
data=conn.recv(1024)
print data
u_input = raw_input("input now")
if u_input != "":
conn.send(u_input)
u_input= ""
问题是它可能卡在用户输入提示符处,因此它不允许我的客户端发送数据。
我该如何解决?
我想将其保留在一个窗口中,这可以用线程解决吗?
(我从未在python中使用过线程)
最佳答案
Python的套接字有一个makefile tool,可以使这种交互更加容易。创建套接字s之后,然后运行f = s.makefile()
。这将返回一个具有类似文件的接口(interface)的对象(因此您可以使用readline,write,writelines和其他方便的方法调用)。 Python标准库本身使用这种方法(例如,参见ftplib和poplib的源代码)。
要从客户端获取文本并将其显示在服务器控制台上,请使用print f.readline()
编写一个循环。
要从服务器控制台获取文本并将其发送到客户端,请使用f.write(raw_input('+ ') + '\n')
编写一个循环。
要同时发送和接收,请执行以下两个步骤以分开线程:
Thread(target=read_client_and_print_to_console).start()
Thread(target=read_server_console_and_send).start()
如果您更喜欢异步而不是线程,请引用以下两个示例:
关于python - 套接字: 2 way communication in python,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8248577/