我正在尝试为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 out out。但是,我的服务器没有响应升级消息。我注意到AutoBahn连接消息(在HTTP GET头中)由于某种原因不包含origin字段。我尝试了一个连接的不同库,它在HTTP GET中有源字段。这是一个已知问题,还是AuotBahn根本不支持?
答案 0 :(得分:1)
Web浏览器会填充origin
字段并禁止任何JavaScript操纵origin
。对于非浏览器WebSocket客户端,客户端可以根据需要设置origin
。因此,WebSocket服务器无法信任origin
。
WebSocket规范不要求origin
出现,AutobahnAndroid目前不支持此设置。
答案 1 :(得分:1)
它接缝为我工作。我在下面发布我丑陋的未经编辑的代码。自从我在WebMatrix中开发以来,我在IIS上运行服务器。
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);
}