我正在尝试一些为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 connect消息(在HTTP GET头中)不包含原始字段。我尝试了一个不同的库,它确实连接了,它在HTTP GET中有origin字段。这是一个已知的问题,还是AuotBahn根本不支持?
发布于 2013-08-29 21:09:26
网页浏览器会填写origin字段,并禁止任何JavaScript操作origin。对于非浏览器WebSocket客户端,客户端可以随心所欲地设置origin。因此,WebSocket服务器无法信任origin。
origin不是WebSocket规范所要求的,并且AutobahnAndroid当前不支持该设置。
发布于 2013-10-02 07:56:12
这看起来对我很有效。我在下面发布了我丑陋的未经编辑的代码。因为我是用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);
// }
});客户端(Android)
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);
}https://stackoverflow.com/questions/18497362
复制相似问题