2

Python Twisted クライアントを使用して socket.io (node.js) サーバーに接続する方法を見つけようとしています。サーバーは私が書いたわけではないチャットサーバーなので、私はそれを制御できません。主に TCP 接続など、いくつか試してみましたが、正常に通信するには Websockets インターフェイスを使用する必要があることがわかりました。

テストのために、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/ : (コールバックが一致しないことはわかっていますが、最初に接続するかどうかを確認したいだけです。そうではありません)。

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 しか知りません。

編集:

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 接続を接続したくないと考えています。これは奇妙なことです。誰かが回避策やアイデアを知っている場合は、共有してください。

4

2 に答える 2

1

Websocket は、socket.io で使用されるプロトコルの 1 つにすぎません。socket.io の仕様https://github.com/LearnBoost/socket.io-specに従って、セッション ID を返すサーバーに POST 要求を行う必要があります。次に、それを使用して、Autobahn を使用してサーバーへの Websocket 接続を作成するための URL を作成できます。

POST を行う:
'http://localhost:8080/socket.io/1/' 応答本文には一意のセッション ID が含まれます。

url = 'ws://socket.io/1/websocket/' + sid + '/'
上記を使用して、アウトバーンでサーバーに接続します。

于 2014-04-06T06:07:17.333 に答える