Python 如何使用Twisted(或Autobahn)连接到socket.io服务器?

Python 如何使用Twisted(或Autobahn)连接到socket.io服务器?,python,node.js,socket.io,twisted,autobahn,Python,Node.js,Socket.io,Twisted,Autobahn,我正试图找到一种方法,通过Python Twisted客户端连接到socket.io(node.js)服务器。服务器是一个聊天服务器,我没有写,所以我没有控制它。 我尝试了一些方法,主要是TCP连接,但我认为我需要使用Websockets接口来成功通信 为了测试,我使用了socket.io教程中的代码,用于服务器 var app = require('http').createServer(handler) , io = require('socket.io').listen(app)

我正试图找到一种方法,通过Python Twisted客户端连接到socket.io(node.js)服务器。服务器是一个聊天服务器,我没有写,所以我没有控制它。 我尝试了一些方法,主要是TCP连接,但我认为我需要使用Websockets接口来成功通信

为了测试,我使用了socket.io教程中的代码,用于服务器

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);
  });
});
对于客户机,我使用了本教程中的示例代码:(我知道回调不匹配,但我只想看看它是否会首先连接,但它不会)

这只是为了看看它是否会连接。问题是,socket.io服务器说:
销毁non-socket.io升级
,因此我猜客户端没有发送正确的升级头,但我不确定

我是否遗漏了一些东西,或者Websocket的实现在不同的库中是否有所不同,并且我需要做一些挖掘工作以便它们进行交流?我觉得这应该很容易。我的问题是,我在客户端上做了哪些更改,以便它能够连接(成功完成握手并开始接受/发送帧)

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

编辑:

打开日志记录后,显示如下:
2013-11-14 22:11:29-0800[-]启动工厂
2013-11-14 22:11:30-0800[未初始化]
[('debug',True,'WebSocketClientFactory'),
('debugcodepath',False,'WebSocketClientFactory'),
('logOctets',True,'WebSocketClientFactory'),
('logFrames',True,'WebSocketClientFactory'),
('trackTimings',False,'WebSocketClientFactory'),
('Allowixie76',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”,
,
“WebSocketClientFactory”)]
2013-11-14 22:11:30-0800[未初始化]已建立到127.0.0.1:8080的连接
2013-11-14 22:11:30-0800[未初始化]GET/HTTP/1.1
用户代理:AutobahnPython/0.6.4
主机:本地主机:8080
升级:WebSocket
连接:升级
Pragma:没有缓存
缓存控制:没有缓存
Sec WebSocket密钥:TOy2OL5T6VwzaiX93cesPw==
Sec WebSocket版本:13
2013-11-14 22:11:30-0800[未初始化]TX八位字节到127.0.0.1:8080:同步=假,八位字节=474554202f20485454502f312e310d0a557365722d4167656e743a204175746f6261686e5079
74686F6E2F302E362E340D0A486F73743A206C6F63616C686F73743A38300D0A5570677726164653A205765665740D0A436F6E6E6E653746F6E3A205570677726164650D0A507261676D613A206E6F
2D63616368650D0A43616368652D436F6E74726F6C3A206E6F2D6363638650D0A5365632D57656253F636B65793A20544F79324F4C3543656777A616958393363657350773D0D0A53632D576562
536f636b65742d56657273696f6e3a2031330d0a0d0a
2013-11-14 22:11:30-0800[EchoClientProtocol,客户端]到127.0.0.1:8080的连接丢失
2013-11-14 22:11:30-0800[EchoClientProtocol,客户端]停止工厂

我认为这是socket.io不想让非socket.io连接连接,这有点奇怪。如果有人知道解决方法或想法,请分享。

我会抓住机会学习新技术:)但如果你坚持使用python,这可能会很有趣。

Websocket只是socket.io使用的一种协议。 根据socket.io规范,我需要向服务器发出POST请求,该请求将返回会话ID。然后,我可以使用该ID生成url,通过Autobahn与服务器建立Websocket连接

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

url='ws://socket.io/1/websocket/'+sid+'/'


使用上面的命令连接到带有Autobahn的服务器。

我不知道socket.io或您的socket.io代码,但是Autobahn可以正确地进行WebSocket打开握手。您可以通过在客户端上设置
debug=True
并查看日志输出来了解更多信息。谢谢您的提示。我用调试日志输出编辑了原始问题。从日志中可以看出,Autobahn启动WebSocket打开握手,但服务器立即硬断开连接。这可能是服务器问题。我将尝试删除行
require('http').createServer(handler)
handler
函数。这似乎适用于普通HTTP。请参见socket.io网站登录页的最末端;我不正确地将请求发送到服务器。谢谢;我来看看。由于它是针对sockjs而不是socket.io的,我感觉它不兼容,但我会尝试一下。答案是针对socket.io v0.9.x的,对于socket.io v1.x,不需要请求会话id。它将直接与ws-url连接。
from twisted.internet import reactor
from autobahn.websocket import WebSocketClientFactory, \
                               WebSocketClientProtocol, \
                               connectWS


class EchoClientProtocol(WebSocketClientProtocol):

   def sendHello(self):
      self.sendMessage("Hello, world!")

   def onOpen(self):
      self.sendHello()

   def onMessage(self, msg, binary):
      print "Got echo: " + msg
      reactor.callLater(1, self.sendHello)


if __name__ == '__main__':

   factory = WebSocketClientFactory("ws://localhost:8080", debug = False)
   factory.protocol = EchoClientProtocol
   connectWS(factory)
   reactor.run()
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>