【问题标题】:Socket.io android java client receiving messages and sending file exampleSocket.io android java客户端接收消息和发送文件示例
【发布时间】:2014-12-11 09:47:09
【问题描述】:

有没有人有任何示例代码来演示在 socket.io 的 java 客户端接收消息?

另外,有没有关于从同一个 socket.io java 客户端发送文件/二进制文件/图片的示例? (基本上是来自 java 而不是 javascript 客户端的示例代码)

android java客户端的版本可以在这里获取(这个版本号称可以和socket.io 1.0及以后一起使用)(好像是最新版本) https://github.com/nkzawa/socket.io-client.java

目前只允许我初始化连接的示例代码,服务器能够获取我的传入连接事件,并且 java socket.io 客户端能够发送基本的发出消息。但是,对于如何从服务器广播或从另一个网站用户发出的消息获取更新,并没有简单的示例。

示例代码仅供参考:

package com.sample.d10132014a;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URISyntaxException;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

import com.github.nkzawa.socketio.client.*; // java socket io client
import com.github.nkzawa.socketio.client.Socket;
import com.github.nkzawa.emitter.Emitter;
import com.github.nkzawa.engineio.client.*; // java engine io client
import com.github.nkzawa.engineio.client.transports.*;


public class MainActivity extends Activity {

    public static String internalPath; // internal storage path
    public static String fileName; // the file name
    private Socket socket; // socket object
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        try 
        {
            socket = IO.socket("http://YOURSERVERIP:3000");
            socket.connect();  // initiate connection to socket server
            socket.emit("chat message",  "From Android to server: 1st outgoing message");
        } 
        catch (URISyntaxException e) 
        {
            e.printStackTrace();
        }


      socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() 
      {

          @Override
          public void call(Object... args) {
              Log.d("socketio", "socket connected");
              socket.emit("chat message", "even connect: message sent from android to socketio server");
              //socket.disconnect(); // why is there a disconnect here?
          }
      }).on("chat message", new Emitter.Listener() {

        @Override
        public void call(Object... arg0) {
            // TODO Auto-generated method stub
            JSONObject obj = (JSONObject)arg0[0];
            Log.d("socketio", "message back: "+obj.toString());
            Log.d("socketio", "incomming chat message: " + obj.toString() + arg0 + arg0[0] + arg0[1]); // trying to test which variable holds the message
        }
        }).on(Socket.EVENT_MESSAGE, new Emitter.Listener() {

            @Override
            public void call(Object... arg0) {
                // TODO Auto-generated method stub
                Log.d("socketio", "socket event message" + arg0);
                socket.emit("chat message", "android to server from event message");
            }
        });




      // 2nd segment test without connecting to 1 long method
      socket.on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() 
      {
        @Override
        public void call(Object... arg0) {
            // TODO Auto-generated method stub
            Log.d("socketio", "socket event connect error");
            socket.emit("chat message",  "android to server: socket event connect error");
        }
      });

      socket.on(Socket.EVENT_MESSAGE, new Emitter.Listener() {

        @Override
        public void call(Object... arg0) {
            // TODO Auto-generated method stub
            Log.d("socketio", "socket event message" + arg0);
            socket.emit("chat message", "android to server from event message");
        }
    });
    setContentView(R.layout.activity_main);


    } // ending onCreate method

} // ending class

感谢阅读

【问题讨论】:

  • 您找到解决问题的方法了吗?我现在遇到了完全相同的问题

标签: java android socket.io


【解决方案1】:

我不确定这是否正是您正在寻找的,并且您可能已经解决了它,无论我想在浏览问题的解决方案时回答它,我在这里遇到了你的问题,但我找不到任何答案,让我很失望。由于我已经解决了我的问题,我想分享一下我是如何做到的。

我的问题是我正在接收来自 node.js 服务器的消息,但我只能在我的 logcat 中看到该消息,而且我在主 UI 线程中的 android 应用程序上打印该消息时确实遇到了问题。

比方说,我们将在列表视图中显示从服务器接收到的消息。

try {
        socket = IO.socket("http://192.168.1.10:3000");
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }

    socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {

        @Override
        public void call(Object... args) {
            Log.d("ActivityName: ", "socket connected");

            // emit anything you want here to the server
            socket.emit("login", some);
            //socket.disconnect();
        }

   // this is the emit from the server
    }).on("someFunction", new Emitter.Listener() {

        @Override
        public void call(Object... args) {
            // this argas[0] can have any type you send from the server
            JSONArray obj = (JSONArray) args[0];
              String message = obj.toString();

            // runOnUiThread is needed if you want to change something in the UI thread
            runOnUiThread(new Runnable() {
                public void run() {
                    // do something
                    //mListData is the array adapter
                        mListData.add("Serversays" + " : " + " " + message);
                        mListData.notifyDataSetChanged();
                        lvList.setSelection(mListData.getCount() -1);
                }
            });
        }
    }).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {

        @Override
        public void call(Object... args) {
            Log.d("ActivityName: ", "socket disconnected");
        }

    });
    socket.connect();

我们只能从主线程更新视图。您必须将更新 ui 的后台任务部分移动到主线程上。所以我们必须添加以下内容并在那里执行我们所需的任务。

runOnUiThread(new Runnable(){

                    @Override
                    public void run() {
//do something
}
}

希望它能为某人节省时间。

【讨论】:

    【解决方案2】:

    您好希望以下实现有所帮助。以下是管理器类,它跟踪所有事件注册。传递回调、创建连接等。

    public class  NetworkManager {
        private static NetworkManager mInstance;
        private Socket mSocket;
        private int RECONNECTION_ATTEMPT = 10;
        private long CONNECTION_TIMEOUT = 30000;
        private static NetworkInterface mNetworkInterface;
    
        public static NetworkManager getInstance(Context context, NetworkInterface interfaces) {
            mNetworkInterface = interfaces;
            if (mInstance == null) {
                mInstance = new NetworkManager();
            }
            return mInstance;
        }
    
        /**
         * The purpose of this method to create the socket object
         */
        public void connectToSocket() {
            try {
                IO.Options opts = new IO.Options();
                opts.timeout = CONNECTION_TIMEOUT;
                opts.reconnection = true;
                opts.reconnectionAttempts = RECONNECTION_ATTEMPT;
                opts.reconnectionDelay = 1000;
                opts.forceNew = true;
                mSocket = IO.socket(NetworkConstant.SOCKET_CONNECTION_URL, opts);
               /*mSocket = IO.socket(NetworkConstant.SOCKET_CONNECTION_URL);
                mSocket.io().timeout(CONNECTION_TIMEOUT);
                mSocket.io().reconnection(true);
                mSocket.io().reconnectionAttempts(RECONNECTION_ATTEMPT);*/
                makeConnection();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * The purpose of the method is to return the instance of socket
         *
         * @return
         */
        public Socket getSocket() {
            return mSocket;
        }
    
        /**
         * The purpose of this method is to connect with the socket
         */
    
        public void makeConnection() {
            if (mSocket != null) {
                mSocket.connect();
                if (mSocket.connected())
                    registerConnectionAttributes();
            }
        }
    
        /**
         * The purpose of this method is to disconnect from the socket interface
         */
        public void disconnectFromSocket() {
            unregisterConnectionAttributes();
            mSocket.disconnect();
            mSocket = null;
            mInstance = null;
        }
    
        public void registerConnectionAttributes() {
            try {
                if(mSocket.connected()) {
                    mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectionError);
                    mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectionTimeOut);
                    mSocket.on(Socket.EVENT_DISCONNECT, onServerDisconnect);
                }} catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        public void unregisterConnectionAttributes() {
            try {
                mSocket.off(Socket.EVENT_CONNECT_ERROR, onConnectionError);
                mSocket.off(Socket.EVENT_CONNECT_TIMEOUT, onConnectionTimeOut);
                mSocket.off(Socket.EVENT_DISCONNECT, onServerDisconnect);
            } catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    
        /**
         * The purpose of this method is to get the call back for any type of connection error
         */
        private Emitter.Listener onConnectionError = new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                Logger.error("Response", "onConnectionError");
                mNetworkInterface.networkCallReceive(NetworkConstant.SERVER_CONNECTION_ERROR);
            }
        };
    
        /**
         * The purpose of this method to get the call back for connection getting timed out
         */
        private Emitter.Listener onConnectionTimeOut = new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                Logger.error("Response", "onConnectionTimeOut");
                mNetworkInterface.networkCallReceive(NetworkConstant.SERVER_CONNECTION_TIMEOUT);
            }
        };
        /**
         * The purpose of this method is to receive the call back when the server get disconnected
         */
        private Emitter.Listener onServerDisconnect = new Emitter.Listener() {
            @Override
            public void call(Object... args) {
                Logger.error("Response", "onServerDisconnection");
                mNetworkInterface.networkCallReceive(NetworkConstant.SERVER_DISCONNECTED);
            }
        };
    
        /**
         * The purpose of this method is register a method on server
         *
         * @param methodOnServer
         * @param handlerName
         */
        public void registerHandler(String methodOnServer, Emitter.Listener handlerName) {
            try {
                if(mSocket.connected())
                mSocket.on(methodOnServer, handlerName);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * The purpose of this method is to unregister a method from server
         *
         * @param methodOnServer
         * @param handlerName
         */
        public void unRegisterHandler(String methodOnServer, Emitter.Listener handlerName) {
            try {
                mSocket.off(methodOnServer, handlerName);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * The purpose of this method is to send the data to the server
         *
         * @param methodOnServer
         * @param request
         */
        public void sendDataToServer(String methodOnServer, JSONObject request) {
            Logger.error("JSON ", request.toString());
            try {
                if(mSocket.connected())
    
                {
                    mSocket.emit(methodOnServer, request);
                }
                else
                    {
                        mNetworkInterface.networkCallReceive(NetworkConstant.SERVER_CONNECTION_ERROR);
                    }
                } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        public interface NetworkInterface {
            public void networkCallReceive(int responseType);
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      经过多次尝试,下面的代码对我有用:

      IO.Options opts = new IO.Options();
      opts.transports = new String[]{"websocket"};
      Socket socket = IO.socket(SERVER_NAME, opts);
      
      socket.on("MY MESSAGE", args -> runOnUiThread(() -> {
          Log.d("Received Message", ((JSONObject) args[0]).toString());
          JSONObject json = new JSONObject();
          
          try {
              json.put("author", "Android");
              json.put("message", "Hello!");
              socket.emit("SERVER SEND", json);
          } catch(Exception e) {
              Log.d("ERROR", e.getMessage());
          }
      }));
      
      socket.connect();
      

      特别感谢这个答案:https://stackoverflow.com/a/31187321/6909832

      【讨论】:

        猜你喜欢
        • 2015-01-16
        • 2021-05-23
        • 2012-05-24
        • 2019-08-04
        • 1970-01-01
        • 1970-01-01
        • 2017-01-11
        • 2020-12-25
        • 1970-01-01
        相关资源
        最近更新 更多