使用自定义socket.io事件将Python客户端连接到Socket.io

时间:2013-11-12 16:11:15

标签: python node.js sockets websocket socket.io

我有一个socket.io服务器(在node.js中),我正在尝试连接python客户端,主要是为我的套接字服务器提供命令行界面。

我正在使用Python的网络套接字,但是,我意识到这只支持四个“事件”:打开,关闭,出错和消息。

我的socket.io服务器定义了.on('connection')等自定义事件。如何在python中发出/接收这样的自定义事件?

到目前为止,这是我的脚本,它只是启动和关闭,所以它不起作用。     导入Web套接字,请求,线程,时间     host ='http://socket-url-server.com'

def on_open(ws):
    def run(*args):
        print 'did connect'
        for i in range(3):
            time.sleep(1)
            result =  ws.recv()
            print 'received:'
            print result
        time.sleep(1)
        ws.close()
        print "thread terminating..."
    thread.start_new_thread(run, ())

def on_message(ws, message):
    print message

def on_error(ws, error):
    print error

def on_close(ws):
    print "### closed ###"

print('Connecting to %s' % host)

socket = host.replace('http://', 'ws://')
print socket
websocket.enableTrace(True)
_ws = websocket.WebSocketApp(socket,
                             on_message = on_message,
                             on_error = on_error,
                             on_close = on_close)
_ws.on_open = on_open
_ws.run_forever()

我应该使用哪种库/方法?如果我自己握手并获取socket.io服务器密钥,那么如何在此之后发出/接收事件?

我也尝试使用https://pypi.python.org/pypi/socketIO-client,但其文档很差

我在下面为它写了下面的脚本,但我得到了No handlers could be found for logger "socketIO_client",它只会永远挂起。

from socketIO_client import SocketIO, BaseNamespace

class Namespace(BaseNamespace):

    def on_connect(self):
        print '[Connected]'

socketIO = SocketIO('http://socket-server-url.com', 80, Namespace)
socketIO.wait(seconds=1)

1 个答案:

答案 0 :(得分:3)

我遇到了同样的问题并且自己解决了这个问题。在这里,我写了一些关于库 socketIO_client 的使用的评论,并希望它有所帮助。

开发环境:服务器/客户端:python

编写的nodejs / sio_client
  1. “找不到处理程序”socketIO_client“的处理程序。这意味着它需要处理程序来记录东西。尝试”导入日志记录; logging.basicConfig(level = logging.DEBUG)“并记录。
  2. “socketio_client永远挂起”,因为它会无休止地重新连接到指定的服务器,即 socketspace 对象在 socketIO 对象初始化并返回之前不会被采用。我有其他线程(称为thr_siohandle)初始化socketio对象,主线程使用Namespace中包含的队列,以检查是否有来自服务器的响应。在运行sio_client之前,似乎应该始终可以访问您的服务器,否则它将保持重新连接,除非您停止该程序。虽然您可以将 wait_for_connection 设置为True来停止它,但您必须自己处理 socketIO_client.exceptions.ConnectionError
  3. FYI

    [2014年2月19日] 对不起,请允许我在有关py_SIOClient的答案中附加一些评论。

    示例代码如下:

    class ChatNamespace(BaseNamespace):
        def on_connect( self ):
            print "connected."
        def on_sayhello_response( self, data ):
            print "response:", data 
    
    sio = SocketIO(host, port, ChatNamespace)
    chatns = sio.define(ChatNamespace, '/chat')
    
    while (1):
        chatns.emit('sayhello', {'name':'John'})
        chatns.wait(1)
    

    此示例中的命令'sayhello'在重置连接时将处于非活动状态,并且不再可以访问Namespace对象聊天(也不会出现错误)。因此,可以通过在每次发送消息之前重新定义专用命名空间来解决它,因为我们不知道何时重置连接(并且在我看来并不重要)。 希望对py_SocketIO_Client工作的人有所帮助。

    补充2014/09/09 因为我使用node(.js)作为后端服务器,但是这个库好像几个月都没有更新,而且它的socket.io只支持 socket.io< 1.0.0 即可。在选择此库之前,请提醒您检查您的包装版本。希望它能帮助人们像我一样面对同样的问题。