2

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

我正在使用 Python 的 Web 套接字,但是,我意识到这仅支持四个“事件”:打开时、关闭时、错误时和消息时。

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

到目前为止,这是我的脚本,它只是启动和关闭,所以它不起作用。导入网络套接字、请求、线程、时间主机 = ' 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)
4

1 回答 1

3

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

开发环境:Server/Client:python编写的nodejs/sio_client

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

供参考

[2014/02/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”将在连接重置时处于非活动状态,并且不再可以访问命名空间对象 chatns(也没有出现错误)。因此,可以通过每次在发出消息之前重新定义专用命名空间来解决它,因为我们不知道连接何时会被重置(我认为这并不重要)。希望它对使用 py_SocketIO_Client 的人有所帮助。

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

于 2014-02-11T05:12:46.357 回答