Android端与Java服务端交互——SocketIO

  • Post author:
  • Post category:java


直接开始进入正题:

  • 先来服务端程序爽一把,话不多说,先上代码:
public class ServerSocketIOForAndroid {

    public static void main(String[] args) {
        /
         * 创建Socket,并设置监听端口
         */
        Configuration config = new Configuration();
//      config.setHostname("192.168.3.225");
        //设置主机名
        config.setHostname("localhost");
        //设置监听端口
        config.setPort(9092);
        /*config.setUpgradeTimeout(10000000);
        config.setPingTimeout(10000000);
        config.setPingInterval(10000000);*/
        final SocketIOServer server = new SocketIOServer(config);

        /
         * 添加连接监听事件,监听是否与客户端连接到服务器
         */
        server.addConnectListener(new ConnectListener() {
            @Override
            public void onConnect(SocketIOClient client) {
                // 判断是否有客户端连接
                if (client != null) {
                    System.out.println("链接成功。。。");
                } else {
                    System.err.println("并没有人链接上。。。");
                }
                System.err.println(client.getSessionId().toString());
            }
        });

        /
         * 添加监听事件,监听客户端的事件
         * 1.第一个参数eventName需要与客户端的事件要一致
         * 2.第二个参数eventClase是传输的数据类型
         * 3.第三个参数listener是用于接收客户端传的数据,数据类型需要与eventClass一致
         */
        server.addEventListener("login", String.class, new DataListener<String>() {
            @Override
            public void onData(SocketIOClient client, String data,
                    AckRequest ackSender) throws Exception {
                // TODO Auto-generated method stub
                System.err.println("接收到客户端的信息为:" + data);
                //向客户端发送消息
                List<String> list = new ArrayList<String>();
                list.add("haode");
                //第一个参数必须与eventName一致,第二个参数data必须与eventClass一致
                client.sendEvent("login", list.toString());
            }
        });
        //启动服务
        server.start();
    }
}

服务端是基于netty-socketio实现的,需要导入相关的jar包,用maven构建,附上配置文件pom.xml

<dependencies>
  <dependency>
      <groupId>com.corundumstudio.socketio</groupId>
      <artifactId>netty-socketio</artifactId>
      <version>1.7.7</version>
  </dependency>
  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>1.7.7</version>
  </dependency>
 </dependencies>

将上述配置参数到工程的pom.xml文件中,即可导入所需要的jar包。


服务端到此为止~~~

============================================

  • Android客户端,老规矩,先上代码爽爽
 //创建socket连接
    private Socket mSocket;
    {
        try {
            mSocket = IO.socket("http://192.168.3.225:9092/");
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }

客户端是基于

socket.io-client-java

实现的,具体使用方式其文档中有详细介绍。

上述代码的作用很明显,是创建一个Socket连接,用于客户端和服务器的通讯,IO.socket()里的内容是你服务器端的地址以及监听的端口。

 //连接到Server
    private void socketConn() {
        mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
        mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
        mSocket.connect();
    }

这一段代码作用是连接客户端和服务器的,并时刻监听Socket连接是中断。

//取消连接Server
        mSocket.disconnect();
        mSocket.off(Socket.EVENT_CONNECT_ERROR, onConnectError);
        mSocket.off(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);

连接之后,需要在哦你D额story()方法中加入取消Socket连接操作。


上述操作完成后,就可以“随意”的向服务端发送数据和接收服务端返回的数据了。

发送数据也很方便,只要简单的几句就OK了。

//设置数据
mSocket.emit("login", list);
//连接服务
mSocket.on("login", onLogin);

onLogin是一个对象。

private Emitter.Listener onLogin = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            String s = (String) args[0];
            if (!"".equals(s) || s != null) {
                Log.e("server data : ", s);
                Message msg = new Message();
                msg.what = 0;
                handler.sendMessage(msg);
            }
        }
    };

在call()方法中可以做一些需要的操作,例如利用handler更新UI等。

最后莫要忘了,在onDestory()方法中off掉on过的连接。

mSocket.off("login", onLogin);



版权声明:本文为lxr_17原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。