2013-11-14 2 views
1

Я пытаюсь выяснить способ подключения к серверу socket.io (node.js) с Python Twisted client. Сервер - это сервер чата, который я не писал, поэтому я не контролирую его. Я пробовал несколько вещей, в основном TCP-соединения, но я решил, что мне нужно будет использовать интерфейс Websockets для успешного общения.Как использовать Twisted (или Autobahn) для подключения к серверу socket.io?

Чтобы проверить, я использовал код из сокета.io tutorial, 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/: (Я знаю, что обратные вызовы не совпадают, но я просто хочу, чтобы увидеть, если он соединится первым, что он не делает).

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 по-разному в разных библиотеках, и что мне нужно будет сделать рытье, чтобы они могли общаться? У меня было ощущение, что это должно быть довольно легко. Мой вопрос: что я могу изменить на клиенте, чтобы он подключался (полное рукопожатие успешно и начало приема/отправки кадров)?

Наконец, я хотел бы использовать Twisted, но я открыт для других предложений. Я понимаю, что самый прямой способ будет делать клиент socket.io, но я знаю только Python.

EDIT:

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 не желая позволить non-socket.io соединения подключения, который отчасти странным. Если кто-нибудь знает обходное решение или какие-либо идеи, поделитесь ими.

+0

Я не знаю о socket.io или вашем файле socket.io, но Autobahn правильно выполняет открытие WebSocket. Вы можете узнать больше, установив 'debug = True' на клиенте и просмотрев вывод журнала. – oberstet

+0

Спасибо за подсказку. Я редактировал исходный вопрос с выводами журнала отладки. –

+0

Как видно из журнала, Autobahn инициирует вступительное рукопожатие с открытием WebSocket, но сервер делает жесткое падение соединения немедленно. Вероятно, это проблема с сервером. Я попытался бы удалить строку 'require ('http'). CreateServer (handler)' и 'handler'. Это похоже на простой HTTP. См. В самом конце целевой страницы сайта socket.io. – oberstet

ответ

1

WebSocket только один протокол, используемый Socket.io. Согласно спецификациям socket.io https://github.com/LearnBoost/socket.io-spec, мне нужно сделать запрос POST на сервер, который вернет идентификатор сеанса. Затем я могу использовать это, чтобы сделать URL-адрес для подключения к серверу с помощью Autobahn.

Делает POST для:
'http://localhost:8080/socket.io/1/' тела ответа будет включать в себя уникальный идентификатор сеанса.

url = 'ws://socket.io/1/websocket/' + sid + '/'
Используйте выше, чтобы подключиться к серверу с помощью Autobahn.

+0

Ответ был о socket.io v0.9.x Для socket.io v1.x нет необходимости запрашивать идентификатор сеанса. Он будет напрямую подключаться непосредственно к ws url. –

0

Я бы прыгать на возможность узнать новые технологии :), но если вы настаиваете на пребывание с питоном это может быть интересно https://github.com/DesertBus/sockjs-twisted

+0

Thanks; Я посмотрю на это. Потому что это для sockjs и не socket.io, у меня есть ощущение, что оно не будет совместимо, но я попробую. –

Смежные вопросы