如何使用Twisted(或高速公路)连接到插座.io服务器?

2024-06-26 14:51:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在想办法连接到插座.io(节点.js)带有Python Twisted客户端的服务器。服务器是一个聊天服务器,我没有写,所以我无法控制它。 我尝试了一些方法,主要是TCP连接,但是我想我需要使用Websockets接口来成功地通信。在

为了测试,我使用了插座.io教程,http://socket.io/#how-to-use用于服务器。在

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(app)
  , fs = require('fs')

app.listen(8080);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

对于客户机,我使用了本教程中的示例代码http://autobahn.ws/python/tutorials/echo/:(我知道回调不匹配,但我只想看看它是否会先连接,但它不匹配)。在

^{pr2}$

这只是想看看它是否能连接起来。问题是插座.io服务器说: destroying non-socket.io upgrade,所以我猜客户端没有发送正确的升级头,但我不确定。在

我是否遗漏了一些东西,或者Websocket的实现在不同的库之间是不同的,我需要做一些挖掘才能让它们进行通信?我有种感觉应该很容易。我的问题是,我要在客户端上做些什么更改以便它能够连接(成功完成握手并开始接受/发送帧)?在

最后,我想使用Twisted,但我愿意接受其他建议。我知道最直接的方法就是插座.io客户端,但我只知道Python。在

编辑:

After turning on logging, it shows this:
2013-11-14 22:11:29-0800 [-] Starting factory <autobahn.websocket.WebSocketClientFactory instance at 0xb6812080>
2013-11-14 22:11:30-0800 [Uninitialized]
        [('debug', True, 'WebSocketClientFactory'),
         ('debugCodePaths', False, 'WebSocketClientFactory'),
         ('logOctets', True, 'WebSocketClientFactory'),
         ('logFrames', True, 'WebSocketClientFactory'),
         ('trackTimings', False, 'WebSocketClientFactory'),
         ('allowHixie76', False, 'WebSocketClientFactory'),
         ('utf8validateIncoming', True, 'WebSocketClientFactory'),
         ('applyMask', True, 'WebSocketClientFactory'),
         ('maxFramePayloadSize', 0, 'WebSocketClientFactory'),
         ('maxMessagePayloadSize', 0, 'WebSocketClientFactory'),
         ('autoFragmentSize', 0, 'WebSocketClientFactory'),
         ('failByDrop', True, 'WebSocketClientFactory'),
         ('echoCloseCodeReason', False, 'WebSocketClientFactory'),
         ('openHandshakeTimeout', 5, 'WebSocketClientFactory'),
         ('closeHandshakeTimeout', 1, 'WebSocketClientFactory'),
         ('tcpNoDelay', True, 'WebSocketClientFactory'),
         ('version', 18, 'WebSocketClientFactory'),
         ('acceptMaskedServerFrames', False, 'WebSocketClientFactory'),
         ('maskClientFrames', True, 'WebSocketClientFactory'),
         ('serverConnectionDropTimeout', 1, 'WebSocketClientFactory'),
         ('perMessageCompressionOffers', [], 'WebSocketClientFactory'),
         ('perMessageCompressionAccept',
          <function <lambda> at 0x177ba30>,
          'WebSocketClientFactory')]
2013-11-14 22:11:30-0800 [Uninitialized] connection to 127.0.0.1:8080 established
2013-11-14 22:11:30-0800 [Uninitialized] GET / HTTP/1.1
        User-Agent: AutobahnPython/0.6.4
        Host: localhost:8080
        Upgrade: WebSocket
        Connection: Upgrade
        Pragma: no-cache
        Cache-Control: no-cache
        Sec-WebSocket-Key: TOy2OL5T6VwzaiX93cesPw==
        Sec-WebSocket-Version: 13

2013-11-14 22:11:30-0800 [Uninitialized] TX Octets to 127.0.0.1:8080 : sync = False, octets = 474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e5079
74686f6e2f302e362e340d0a486f73743a206c6f63616c686f73743a383038300d0a557067726164653a20576562536f636b65740d0a436f6e6e656374696f6e3a20557067726164650d0a507261676d613a206e6f
2d63616368650d0a43616368652d436f6e74726f6c3a206e6f2d63616368650d0a5365632d576562536f636b65742d4b65793a20544f79324f4c35543656777a616958393363657350773d3d0d0a5365632d576562
536f636b65742d56657273696f6e3a2031330d0a0d0a
2013-11-14 22:11:30-0800 [EchoClientProtocol,client] connection to 127.0.0.1:8080 lost
2013-11-14 22:11:30-0800 [EchoClientProtocol,client] Stopping factory <autobahn.websocket.WebSocketClientFactory instance at 0xb6812080>

我认为这是插座.io不想让不-插座.io连接连接,这有点奇怪。如果有人知道解决办法或任何想法,请与我们分享。在


Tags: toio服务器falsetrueapphttp客户端
2条回答

我会抓住学习新技术的机会:)但是如果你坚持和python呆在一起,这可能会很有趣https://github.com/DesertBus/sockjs-twisted

Websocket只是插座.io. 根据插座.io规范https://github.com/LearnBoost/socket.io-spec,我需要向服务器发出POST请求,该请求将返回一个会话ID。然后,我可以使用该请求创建一个url,用Autobahn与服务器建立Websocket连接。在

发帖至:
'http://localhost:8080/socket.io/1/' 响应主体将包含一个唯一的会话ID

url = 'ws://socket.io/1/websocket/' + sid + '/'
使用上面的方法连接到带有高速公路的服务器。在

相关问题 更多 >