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

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

为了testing,我使用了socket.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/ :(我知道callback不匹配,但我只想看看它是否会先连接,它不)。

 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() 

这只是看它是否会连接。 问题是,socket.io服务器说: destroying non-socket.io upgrade ,所以我猜客户端没有发送适当的UPGRADE标题,但我不知道。

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

最后,我想使用扭曲,但我打开其他build议。 我明白最直接的将会是一个socket.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> 

我把这个socket.io不想让nonsocket.io连接连接,这有点古怪。 如果有人知道解决方法或任何想法,请分享。

Websocket只是socket.io使用的一种协议。 根据socket.io规范https://github.com/LearnBoost/socket.io-spec ,我需要向服务器发出POST请求,这将返回一个会话ID。 然后,我可以使用它来创build一个URL与Web服务器连接到Autobahn服务器。

做一个POST到:
'http://localhost:8080/socket.io/1/'响应正文将包含一个唯一的会话ID。

url = 'ws://socket.io/1/websocket/' + sid + '/'
使用上面的方法用Autobahn连接到服务器。

我会跳上学习新技术的机会:)但如果你坚持留在python这可能是有趣的https://github.com/DesertBus/sockjs-twisted