Python套接字编程 - 在监听连接时需要做一些事情

时间:2012-02-16 06:11:38

标签: python sockets

我正在使用python设计一些硬件接口。我需要做的是如下,

〜初始化驱动程序 〜启动设备 〜在端口2626创建一个套接字并等待客户端连接以接收数据 〜如果任何客户端已连接,则在为所有其他连接的客户端提供服务时发送问候消息,并将此客户端添加到连接的客户端列表。 〜如果设备上发生任何事件,则可以通过此事件数据检测到温度升高到所有连接的客户端。 〜任何连接的客户端都可以向服务器询问任何特定数据。

这是我的过程。我让设备部件工作得很好,现在它的打印数据到控制台和套接字服务器我有以下代码,这正如我所期望的那样正常。 但是问题是在调用“run()”之后它进入了while循环。虽然很明显。当我正在收听新的连接时,我无法调用任何其他功能。

在听取连接时我应该能够发送/接收。任何想法如何做到这一点?

这是我的服务器程序,它可以很好地监听连接。在听的时候你不允许任何事情。 :(

#!/usr/bin/env python

import socket
import select

class ChatServer:

    def __init__( self, port ):
        self.port = port;

        self.srvsock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
        self.srvsock.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
        self.srvsock.bind( ("", port) )
        self.srvsock.listen( 5 )

        self.descriptors = [self.srvsock]
        print 'Server started on port %s' % port

    def run( self ):
        while 1:
            # Await an event on a readable socket descriptor
            (sread, swrite, sexc) = select.select( self.descriptors, [], [] )
            # Iterate through the tagged read descriptors
            for sock in sread:
                # Received a connect to the server (listening) socket
                if sock == self.srvsock:
                    self.accept_new_connection()
                else:
                    # Received something on a client socket
                    str = sock.recv(100)

                    # Check to see if the peer socket closed
                    if str == '':
                        host,port = sock.getpeername()
                        str = 'Client left %s:%s\r\n' % (host, port)
                        self.broadcast_string( str, sock )
                        sock.close
                        self.descriptors.remove(sock)
                    else:
                        host,port = sock.getpeername()
                        newstr = '[%s:%s] %s' % (host, port, str)
                        self.broadcast_string( newstr, sock )

    def accept_new_connection( self ):
        newsock, (remhost, remport) = self.srvsock.accept()
        self.descriptors.append( newsock )

        newsock.send("You're connected to the Python server\r\n")
        str = 'Client joined %s:%s\r\n' % (remhost, remport)
        self.broadcast_string( str, newsock )

    def broadcast_string( self, str, omit_sock ):
        for sock in self.descriptors:
            if sock != self.srvsock and sock != omit_sock:
                sock.send(str)
        print str,

myServer = ChatServer( 2626 ).run()

提前感谢您的所有帮助:)

3 个答案:

答案 0 :(得分:1)

您需要制作所有套接字non-blocking

答案 1 :(得分:1)

使用Twisted

显示具有核心python的异步网络的示例是here

答案 2 :(得分:1)

由于扭曲是不可能的,我建议使用socketserver模块。

要轻松入手,请参阅此example