SocketIO Android 未发出连接事件
SocketIO Android not emitting connection event
我正在使用 Android native socketio library 和 NodeJS。
// on my Android activity
private Socket mSocket;
{
try {
mSocket = IO.socket("http://IP_OF_MY_SERVER");
} catch (URISyntaxException e) {}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSocket.connect();
}
.
// on my nodejs app
var restify = require('restify');
var server = restify.createServer({
name: 'myapp',
version: '1.0.0'
});
var io = require('socket.io')(server.server);
server.use(restify.acceptParser(server.acceptable));
server.use(restify.queryParser());
server.use(restify.bodyParser());
io.on('connection', function(socket){
console.log('a user connected');
socket.on('new-item', function(data) {
console.log(data);
});
});
我正在遵循官方指南,但仍然 mSocket.connect()
没有发出 connection
事件,并且当我启动 activity.[=23 时,我的控制台上没有 a user connected
=]
你能告诉我我遗漏了什么吗?我该如何调试它?
编辑
我的 Ubuntu 服务器上的 NodeJS 应用程序:http://paste.ubuntu.com/14233470/
Android activity : http://paste.ubuntu.com/14233482/
编辑 2
我已经按照建议更改了代码 here:
var io = require('socket.io').listen(server);
这次我在启动 activity
时遇到了这个错误
myapp 在 http://104.131.99.145:3000
监听
http.js:691
throw new Error('Can\'t set headers after they are sent.');
^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (http.js:691:11)
at ServerResponse.format (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/response.js:145:10)
at ServerResponse.send (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/response.js:338:14)
at emitRouteError (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/server.js:201:13)
at onRoute (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/server.js:754:21)
at Router.find (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/router.js:608:5)
at Server._route (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/server.js:747:21)
at routeAndRun (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/server.js:705:14)
at Server._handle (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/server.js:725:9)
at Server.onRequest (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/server.js:326:14)
at Server.EventEmitter.emit (events.js:98:17)
at HTTPParser.parser.onIncoming (http.js:2108:12)
at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23)
at Socket.socket.ondata (http.js:1966:22)
at TCP.onread (net.js:525:27)
几个要点:
创建一个Socket
对象:
private Socket mSocket;
{
try {
mSocket = IO.socket(CHAT_SERVER_URL); // Your server's URL
}
catch (URISyntaxException e) {
throw new RuntimeException(e);
}
}
onCreate()
: connect & set the socket error listener
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
mSocket.connect();
}
private Emitter.Listener onConnectError = new Emitter.Listener() {
@Override
public void call(Object... args) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Unable to connect to NodeJS server", Toast.LENGTH_LONG).show();
}
});
}
};
断开onDestroy()
方法中的Socket
@Override
protected void onDestroy() {
super.onDestroy();
mSocket.disconnect();
mSocket.off(Socket.EVENT_CONNECT_ERROR, onConnectError);
mSocket.off(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
}
没有收到错误信息是正确设置的第一个里程碑。
- 创建一个WLAN:
(Open the command line with admin privileges, run these commands:)
netsh wlan set hostednetwork mode=allow ssid=NodeSocket key=1234okok
netsh wlan start hostednetwork
确保您的 Android 设备已连接到此网络,并且您的 Node.js
服务器已启动且 运行。
我正在使用 Android native socketio library 和 NodeJS。
// on my Android activity
private Socket mSocket;
{
try {
mSocket = IO.socket("http://IP_OF_MY_SERVER");
} catch (URISyntaxException e) {}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSocket.connect();
}
.
// on my nodejs app
var restify = require('restify');
var server = restify.createServer({
name: 'myapp',
version: '1.0.0'
});
var io = require('socket.io')(server.server);
server.use(restify.acceptParser(server.acceptable));
server.use(restify.queryParser());
server.use(restify.bodyParser());
io.on('connection', function(socket){
console.log('a user connected');
socket.on('new-item', function(data) {
console.log(data);
});
});
我正在遵循官方指南,但仍然 mSocket.connect()
没有发出 connection
事件,并且当我启动 activity.[=23 时,我的控制台上没有 a user connected
=]
你能告诉我我遗漏了什么吗?我该如何调试它?
编辑
我的 Ubuntu 服务器上的 NodeJS 应用程序:http://paste.ubuntu.com/14233470/
Android activity : http://paste.ubuntu.com/14233482/
编辑 2
我已经按照建议更改了代码 here:
var io = require('socket.io').listen(server);
这次我在启动 activity
时遇到了这个错误myapp 在 http://104.131.99.145:3000
监听http.js:691
throw new Error('Can\'t set headers after they are sent.');
^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (http.js:691:11)
at ServerResponse.format (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/response.js:145:10)
at ServerResponse.send (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/response.js:338:14)
at emitRouteError (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/server.js:201:13)
at onRoute (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/server.js:754:21)
at Router.find (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/router.js:608:5)
at Server._route (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/server.js:747:21)
at routeAndRun (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/server.js:705:14)
at Server._handle (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/server.js:725:9)
at Server.onRequest (/var/www/biditapi.erayalakese.com/node_modules/restify/lib/server.js:326:14)
at Server.EventEmitter.emit (events.js:98:17)
at HTTPParser.parser.onIncoming (http.js:2108:12)
at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23)
at Socket.socket.ondata (http.js:1966:22)
at TCP.onread (net.js:525:27)
几个要点:
创建一个
Socket
对象:private Socket mSocket; { try { mSocket = IO.socket(CHAT_SERVER_URL); // Your server's URL } catch (URISyntaxException e) { throw new RuntimeException(e); } }
onCreate()
: connect & set the socket error listener@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError); mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError); mSocket.connect(); } private Emitter.Listener onConnectError = new Emitter.Listener() { @Override public void call(Object... args) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "Unable to connect to NodeJS server", Toast.LENGTH_LONG).show(); } }); } };
断开
onDestroy()
方法中的Socket@Override protected void onDestroy() { super.onDestroy(); mSocket.disconnect(); mSocket.off(Socket.EVENT_CONNECT_ERROR, onConnectError); mSocket.off(Socket.EVENT_CONNECT_TIMEOUT, onConnectError); }
没有收到错误信息是正确设置的第一个里程碑。
- 创建一个WLAN:
(Open the command line with admin privileges, run these commands:)
netsh wlan set hostednetwork mode=allow ssid=NodeSocket key=1234okok
netsh wlan start hostednetwork
确保您的 Android 设备已连接到此网络,并且您的 Node.js
服务器已启动且 运行。