【问题标题】:Can't get AutoBahn Websocket to Connect无法让 AutoBahn Websocket 连接
【发布时间】:2013-08-28 20:13:46
【问题描述】:

我正在尝试一些为 Android 使用而开发的 websocket 客户端库。我现在正在摆弄 AutoBahn 库,似乎无法让“示例”客户端连接到我的服务器。我正在使用以下代码:

          try {
         mConnection.connect(wsuri, new WebSocketHandler() {

            @Override
            public void onOpen() {
               Log.d(TAG, "Status: Connected to " + wsuri);
                mConnection.sendTextMessage("info");
            }

           @Override
            public void onTextMessage(String payload) {
               Log.d(TAG, "Got echo: " + payload);
            }

           @Override
            public void onClose(int code, String reason) {
               Log.d(TAG, "Connection lost.");
            }
         });
      } catch (WebSocketException e) {

         Log.d(TAG, e.toString());
      }

我用wireshark嗅探,可以看到tcp连接建立,我可以看到HTTP Get出去了。但是,我的服务器没有响应升级消息。我确实注意到 AutoBahn 连接消息(在 HTTP GET 标头中)由于某种原因不包含源字段。我尝试了一个不同的库,它确实连接了,它在 HTTP GET 中有源字段。这是一个已知问题,还是 AuotBahn 根本不支持?

【问题讨论】:

    标签: android autobahn


    【解决方案1】:

    Web 浏览器填写origin 字段并禁止任何JavaScript 操作origin。对于非浏览器的 WebSocket 客户端,客户端可以随意设置origin。因此 origin 不能被 WebSocket 服务器信任。

    WebSocket 规范不要求存在origin,AutobahnAndroid 目前不支持设置。

    【讨论】:

      【解决方案2】:

      它似乎对我有用。我在下面发布了我丑陋的未经编辑的代码。自从我在 WebMatrix 中开发以来,我在 IIS 上运行服务器。

      服务器(Node.js)

      var express = require('express')
      var http = require('http');
      var wamp = require('wamp.io');
      var io = require('websocket.io');
      
      // Setup Express
      var app = express(); 
      var server = http.createServer(app);
      app.listen(process.env.PORT);
      app.use(express.static(__dirname + '/public'));
      
      // Setup WAMP
      var ws = io.listen(9000);
      var apps = wamp.attach(ws);
      
      apps.on('call', function(procUri, args, cb) {
        //if (procUri === 'isEven') {
          cb(null, args[0] % 2 == 0);
       // }
      });
      

      客户端(安卓)

      private final WebSocketConnection mConnection = new WebSocketConnection();
      
      private void start() {
          final String wsuri = "ws://192.168.0.111:9000/topic5"; // Hardcoded local (Need to open a port on server)
          mConnection.disconnect();
      
          try {
              mConnection.connect(wsuri, new WebSocketHandler() {
      
                  @Override
                  public void onOpen() {
                      Log.d(TAG, "Status: Connected to " + wsuri);
                      testRpc();
                  }
      
                  @Override
                  public void onClose(int code, String reason) {
                      Log.d(TAG, "Connection lost.");
                      start(); // Ugly reconnect
                  }
              });
          } catch (WebSocketException e) {
              Log.d(TAG, e.toString());
          }
      }
      
      private void testRpc() {
          mConnection.call("calc:asum", Integer.class, new Wamp.CallHandler() {
      
              @Override
              public void onResult(Object result) {
                  mDumpTextView.setText(result.toString());
              }
      
              @Override
              public void onError(String errorId, String errorInfo) {
                  mDumpTextView.setText("calc:asum RPC error - " + errorInfo);
              }
          }, 3);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-14
        • 1970-01-01
        • 2015-11-10
        • 2019-10-14
        相关资源
        最近更新 更多