我已经使用socket.io将Android客户端连接到node.js服务器,我可以将消息发送到服务器但不能在客户端上接收。 对于客户端,我做的事情就像
Log.i("MainActivity: ", "sending message");
final JSONObject sdpObj = new JSONObject();
try {
sdpObj.put("id","presenter");
sdpObj.put("sdpOffer",localSdpOffer.description);
} catch (JSONException e) {
e.printStackTrace();
}
LoginActivity.mSocket.emit("new message", sdpObj);
并且在服务器上我收到了如下对象:
io.sockets.on('connection',function(socket){
socket.on('new message',function(message){
// some logic
socket.emit('created',object);
然后在客户端:
LoginActivity.mSocket.on("created", new Emitter.Listener() {
@Override
public void call(Object... args) {
Log.i( TAG, "message back:received ");
User user = new User();
JSONObject obj = null;
try {
obj = new JSONObject((String) args[0]);
//Log.i(TAG,"SdpAnswer: "+args[0].sdpAnswer+"id "+obj.sdpAnswer);
Log.i(TAG, "Instance of"+args[0].toString());
}
});
}
但由于某种原因,它从未收到消息。 任何人都有一些想法为什么会这样?谢谢!
答案 0 :(得分:2)
如果您按照文档使用nkzawa的socket.io库,则必须使用runonUIThread方法处理调用方法的内部。
import com.github.nkzawa.emitter.Emitter;
private Emitter.Listener onNewMessage = new Emitter.Listener() {
@Override
public void call(final Object.. args) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
JSONObject data = (JSONObject) args[0];
String username;
String message;
try {
username = data.getString("username");
message = data.getString("message");
} catch (JSONException e) {
return;
}
// add the message to view
addMessage(username, message);
}
});
}
};
这就是onNewMessage的样子。侦听器是Emitter.Listener的一个实例,必须实现调用方法。你会注意到call()内部被Activity#runOnUiThread()包装,这是因为总是在Android UI线程的另一个线程上调用回调,因此我们必须确保在视图中添加一条消息。 UI线程。
有关详细信息,请参阅此链接: Native Socket.IO and Android
答案 1 :(得分:1)
好的,所以我在经过一些搜索后想出来了。似乎为了正确维护不同android活动的套接字连接,我必须实现一个单例类,我已经定义了套接字连接。问题是我在一个活动中实例化套接字连接并试图在另一个活动中使用该连接即使我可以在另一个活动上发送消息,我也无法收到任何消息,除非我将套接字移动到收到消息的活动中。你可以找到很多关于如何实现单例类的例子,因此它并不难,它解决了我的问题。祝你有愉快的一天:)