0

我正在尝试为 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 根本不支持?

4

2 回答 2

1

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

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

于 2013-08-29T13:09:25.627 回答
1

它似乎对我有用。我在下面发布了我丑陋的未经编辑的代码。自从我在 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);
}
于 2013-10-01T23:56:12.110 回答