【发布时间】:2012-02-16 06:11:38
【问题描述】:
我正在用python设计一些硬件接口。我需要做的如下,
~初始化驱动 ~启动设备 ~ 在 2626 端口创建一个套接字并等待客户端连接以接收数据 ~如果有任何客户端连接,则在为所有其他连接的客户端提供服务时发送 hello 消息,并将该客户端添加到连接的客户端列表中。 〜如果设备上发生任何事件,可以说检测到温度升高,然后通过此事件数据到所有连接的客户端。 ~任何连接的客户端都可以向服务器请求任何特定数据。
这是我的过程。我让设备部分工作得很好,现在它打印数据到控制台,对于套接字服务器,我有以下代码,正如我预期的那样工作得很好。 但问题是在调用“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()
提前感谢您的所有帮助:)
【问题讨论】:
-
使用Twisted?
-
@MikeCooper 感谢您的建议好友。我是 python 新手。您有任何示例吗?或者您能指出一些快速入门的教程吗?