Android App Connecting to Node.js server using Socket.io

后端 未结 4 478
一生所求
一生所求 2020-12-07 15:15

I\'m having trouble getting my Android app to connect to a socket.io chat server. I\'m using socket.io-java-client created by Gottox which can be found here: https://github.

4条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-07 15:24

    I actually solved the problem. I used my PC's local IP http://192.168.0.xxx:7000 and the app was able to connect to the chat server from the emulator. I don't know why this works, but it might help out someone in the future :)

    Update:

    This is how I ended up structuring the project. I created a singleton class to handle socket connections Android side (you could also do it as a service). When receiving a message, the singleton class broadcasts an intent to the rest of the app. The intent is then picked up by a broadcast receiver in the relevant activity.

    Android Side (singleton):

    public class SocketSingleton {
    
        private static SocketSingleton instance;
        private static final String SERVER_ADDRESS = "http://1.2.3.4:1234";
        private SocketIO socket;
        private Context context;
    
        public static SocketSingleton get(Context context){
            if(instance == null){
                instance = getSync(context);
            }
            instance.context = context;
            return instance;
        }
    
        public static synchronized SocketSingleton getSync(Context context){
            if (instance == null) {
                instance = new SocketSingleton(context);
            }
            return instance;
        }
    
        public SocketIO getSocket(){
            return this.socket;
        }
    
        private SocketSingleton(Context context){
            this.context = context;
            this.socket = getChatServerSocket();
            this.friends = new ArrayList();
        }
    
        private SocketIO getChatServerSocket(){
            try {
                SocketIO socket = new SocketIO(new URL(SERVER_ADDRESS), new IOCallback() {
                    @Override
                    public void onDisconnect() {
                        System.out.println("disconnected");
                    }
    
                    @Override
                    public void onConnect() {
                        System.out.println("connected");
                    }
    
                    @Override
                    public void on(String event, IOAcknowledge ioAcknowledge, Object... objects) {
                        if (event.equals("chatMessage")) {
                            JSONObject json = (JSONObject) objects[0];
                            ChatMessage chatMessage = new ChatMessage(json);
    
                            Intent intent = new Intent();
                            intent.setAction("newChatMessage");
                            intent.putExtra("chatMessage", chatMessage);
                            context.sendBroadcast(intent);
                        }
                    }
                    @Override
                    public void onError(SocketIOException e) {
                        e.printStackTrace();
                    }
                });
                return socket;
            } catch (MalformedURLException ex) {
                ex.printStackTrace();
            }
            return null;
        }
    }
    

    Android Side (activity):

    public class ChatActivity extends Activity {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);
        IntentFilter newChatMessageFilter = new IntentFilter("newChatMessage");
        this.registerReceiver(new MessageReceiver(), newChatMessageFilter);
    
        ...
    
        public class MessageReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent){
                final ChatMessage chatMessage =(ChatMessage) intent.getExtras().get("chatMessage");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mAdapter.add(chatMessage);
                        mAdapter.notifyDataSetChanged();
                    }
                });
            }
        }
    } 
    

    Server Side:

    var express = require('express');
    var app = express();
    var server = require('http').createServer(app).listen(1234);
    var io = require('socket.io').listen(server);
    
    io.sockets.on('connection', function(client){
    
        console.log("client connected: " + client.id);
    
        client.on("sendTo", function(chatMessage){
            console.log("Message From: " + chatMessage.fromName);
            console.log("Message To: " + chatMessage.toName);
    
    
            io.sockets.socket(chatMessage.toClientID).emit("chatMessage", {"fromName" : chatMessage.fromName,
                                                                        "toName" : chatMessage.toName,
                                                                        "toClientID" : chatMessage.toClientID,
                                                                        "msg" : chatMessage.msg});
    
        });
    });
    

提交回复
热议问题