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

后端 未结 4 457
一生所求
一生所求 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<Friend>();
        }
    
        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});
    
        });
    });
    
    0 讨论(0)
  • 2020-12-07 15:28

    I know this not really answers to the OP's posts, but for those who may be interested, this is a tutorial I made to make communicate your Android with a Node.js server -without any additional library- :

    https://causeyourestuck.io/2016/04/27/node-js-android-tcpip/

    This is a foretaste of how it looks like at the end:

    Client socket = new Client("192.168.0.8", 1234);
    socket.setOnEventOccurred(new Client.OnEventOccurred() {
        @Override
        public void onMessage(String message) {
        }
    
        @Override
        public void onConnected(Socket socket) {
            socket.send("Hello World!");
            socket.disconnect();
        }
    
        @Override
        public void onDisconnected(Socket socket, String message) {
        }
    });
    
    socket.connect();
    
    0 讨论(0)
  • 2020-12-07 15:38

    Puma has already answered on how you can implement a socket connection using SocketIO. This has nothing new to contribute. Yet, it is an attempt to help fellow newbies, as also introduce the implementation of Socket.io's java library.

    Socket.IO has its own java implementation on Github, which you can follow along to create a socket application for Android/Java.

    Android side:

    Include this in your build gradle

    compile ('io.socket:socket.io-client:0.8.3') {
        // excluding org.json which is provided by Android
        exclude group: 'org.json', module: 'json'
    }
    

    Provide Permission in your app:

    <uses-permission android:name="android.permission.INTERNET" />
    

    Android Code: The structure of code is similar to how you would code in Node. The message in socket.on is similar to node's socket.on('message', ...)

    import io.socket.client.Socket;
    import io.socket.client.IO;
    import io.socket.emitter.Emitter;
    
    final Socket socket;
    try{
    socket = IO.socket("http://192.168.1.1:8080");
    
    socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
    
        @Override
        public void call(Object... args) {
            socket.emit("message", "hi");
            socket.disconnect();
        }
    
    }).on("message", new Emitter.Listener() {
            //message is the keyword for communication exchanges
        @Override
        public void call(Object... args) {
            socket.emit("message", "hi");
        }
    
    }).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
    
        @Override
        public void call(Object... args) {}
    
    });
        socket.connect();
    
    }
    catch(Exception e){
        
    }
    

    Node.js side

    Create normal sockets using socket.io

    0 讨论(0)
  • 2020-12-07 15:47

    You're emulator network is different from your PC's as I have heard. So if you could by change try this on an actual phone that is connected to the same network as your PC.

    You probably wont be able to ping 10.0.2.2 from your emulator or the other way around from your pc to emulator.

    0 讨论(0)
提交回复
热议问题