套接字:python中的2路通信

时间:2011-11-23 20:23:59

标签: python sockets

我想在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

我现在想要做的是实现一些东西,这样这个脚本也接受用户输入,在输入键被命中后,将它发送回客户端。

但我无法弄明白我该怎么做?因为我会这样做:

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中使用过线程)

3 个答案:

答案 0 :(得分:3)

Python的套接字有一个makefile tool,可以让这种交互变得更加容易。创建套接字 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()

如果你喜欢异步线程,这里有两个让你入门的例子:

答案 1 :(得分:2)

基本问题是您有两个等待输入的输入源:套接字和用户。我能想到的三种主要方法是使用异步I / O,使用具有多个线程的同步(阻塞)I / O,或者使用具有超时的同步I / O.最后一种方法在概念上是最简单的:等待套接字上的数据达到一些超时时间,然后切换到等待用户输入要发送的数据,然后返回到套接字等。

我知道在较低级别,您可以通过将套接字和stdin视为I / O句柄并使用select同时等待它们来相对容易地实现它,但我不能回想一下,如果该功能被映射到Python,或者如果是,那么如何。如果你能使它工作,这可能是一个很好的处理方法。编辑:我查了一下,Python确实有一个select模块,但听起来它在Unix操作系统下只有这样的功能 - 在Windows中,它只能接受套接字,而不是标准输入或文件。

答案 2 :(得分:1)

你检查过扭曲吗? twisted python事件驱动的网络引擎和库或 oidranot一个python库,特别是基于torando Web服务器的python库