我想在Python中进行双向通信:
我想绑定到一个客户端可以连接到的套接字,然后服务器和客户端可以相互"聊天".
我已经有了基本的听众:
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
Run Code Online (Sandbox Code Playgroud)
我现在要做的是实现一些东西,这样这个脚本也接受用户输入,在输入键被命中后,将它发送回客户端.
但我无法弄清楚我该怎么做?因为我会这样做:
while bool==1:
data=conn.recv(1024)
print data
u_input = raw_input("input now")
if u_input != "":
conn.send(u_input)
u_input= ""
Run Code Online (Sandbox Code Playgroud)
问题是它可能在用户输入提示符处挂起,因此它不允许我的客户端发送数据.
我该如何解决这个问题?
我想将它保存在一个窗口中,这可以通过线程来解决吗?
(我从未在python中使用过线程)
Python 的套接字有一个makefile 工具,可以使这种交互变得更加容易。创建套接字s后,然后运行f = s.makefile()。这将返回一个具有类似文件接口的对象(因此您可以使用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()
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢异步而不是线程,这里有两个示例可以帮助您入门:
基本问题是您有两个正在等待的输入源:套接字和用户。我能想到的三种主要方法是使用异步 I/O、使用具有多个线程的同步(阻塞)I/O 或使用带超时的同步 I/O。最后一种方法在概念上是最简单的:在套接字上等待数据一段超时时间,然后切换到等待用户输入要发送的数据,然后返回套接字,等等。
我知道在较低的级别上,您可以通过将套接字和标准输入视为 I/O 句柄并使用select同时等待它们来相对轻松地实现这一点,但我不记得该功能是否映射到 Python 中,或者如果是这样,怎么办?如果你能让它发挥作用,这可能是处理这个问题的一个非常好的方法。编辑:我查了一下,Python确实有一个select模块,但听起来它只能在Unix操作系统下发挥这样的作用——在Windows中,它只能接受套接字,不能接受标准输入或文件。