socketIO服务端与客户端(android)通信(记录)

PS:按下列方式写完还是连接失败时,看下面的建议:

在这里插入图片描述

服务端:

导入框架:netty-socketio

       <dependency>
            <groupId>com.corundumstudio.socketio</groupId>
            <artifactId>netty-socketio</artifactId>
            <version>1.7.17</version>
        </dependency>

简单使用代码:

@SpringBootApplication
public class SocketApplication {

    public static void main(String[] args) {
        SpringApplication.run(SocketApplication.class, args);
        Configuration config = new Configuration();
        config.setHostname("192.168.1.xxx"); // 用自己的ip
        config.setPort(8888);

        SocketConfig sockConfig = new SocketConfig();
        //地址服用,这时候再启动不报错
        sockConfig.setReuseAddress(true);

        //设置使用的协议和轮询方式
        config.setTransports( Transport.WEBSOCKET, Transport.POLLING);
        //设置允许源
        config.setOrigin(":*:");

        config.setSocketConfig(sockConfig);
        //允许最大帧长度
        config.setMaxFramePayloadLength(1024 * 1024);
        //允许下最大内容
        config.setMaxHttpContentLength(1024 * 1024);
        SocketIOServer server = new SocketIOServer(config);
        server.addConnectListener(new ConnectListener() {
            public void onConnect(SocketIOClient client) {
                // TODO Auto-generated method stub
                String clientInfo = client.getRemoteAddress().toString();
                String clientIp = clientInfo.substring(1, clientInfo.indexOf(":"));// 获取ip
                System.out.println("建立客户端连接ip"+clientIp);
                client.sendEvent("connected", "ip: " + clientIp);
            }
        });

        server.addDisconnectListener(new DisconnectListener() {

            public void onDisconnect(SocketIOClient client) {
                String clientInfo = client.getRemoteAddress().toString();
                String clientIp = clientInfo.substring(1, clientInfo.indexOf(":"));// 获取ip
                System.out.println("断开客户端连接ip"+clientIp);
                client.sendEvent("disconned", "ip: " + clientIp);

            }
        });

        server.addEventListener("msg", String.class, new DataListener<String>() {

            public void onData(SocketIOClient client, String data, AckRequest arg2) throws Exception {
                // TODO Auto-generated method stub
                String clientInfo = client.getRemoteAddress().toString();
                String clientIp = clientInfo.substring(1, clientInfo.indexOf(":"));
                System.out.println(clientIp + ":客户端:" + data);

                client.sendEvent("msg", "客户端!!我给你返回信息了!!!!!");
            }
        });
       

        server.start();
//		server.stop();
    }

}

客户端

导入框架:socket.io-client-java

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

简单使用代码:

public class MainActivity extends AppCompatActivity {
    private Button btnConnect; //连接
    private Button btnMessage; //消息
    private Button btnDisconnect; //断开
    private Socket socket;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initEvent();
    }

    private void initSocket() {
        try {
            socket = IO.socket("http://192.168.1.105:8888");
            socket.connect();
            socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    Log.e("AAA", "第一次连接成功1");
                }
            });
            socket.on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    for (Object o : args) {
                        Log.e("AAA", "活动连接错误2" + o.toString());
                    }
                }
            });
            socket.on(Socket.EVENT_CONNECT_TIMEOUT, new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    Log.e("AAA", "活动连接超时3");
                }
            });
            socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    Log.e("AAA", "断开连接4");
                }
            });
            socket.on(Socket.EVENT_CONNECTING, new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    for (Object o : args) {
                        Log.e("AAA", "活动连接5" + o.toString());
                    }
                }
            });
            socket.on(Socket.EVENT_ERROR, new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    Log.e("AAA", "事件错误6");
                }
            });
            socket.on("msg", new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    Log.e("AAA", "服务器发来msg:" + args[0]);
                }
            });

        } catch (URISyntaxException e) {
            e.printStackTrace();
            Log.e("AAA", "抛出异常:" + e.getMessage());
        }
    }

    private void initEvent() {
        // 连接
        btnConnect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                initSocket();
            }
        });
        // 消息
        btnMessage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                socket.emit("msg", "哈哈哈哈哈哈");
            }
        });
        // 断开
        btnDisconnect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                socket.disconnect();
            }
        });
    }

    private void initView() {
        btnConnect = (Button) findViewById(R.id.btn_connect);
        btnMessage = (Button) findViewById(R.id.btn_message);
        btnDisconnect = (Button) findViewById(R.id.btn_disconnect);
    }
}

socketIO使用时遇到的坑:

  • 客户端与服务端消息通信的key值一定要对应,不然无法正常通信(反之服务端给客户端发消息也是如此)

例:

客户端发信息:
socket.emit("msg", "哈哈哈哈哈哈");

服务端监听事件的key必须是“msg”才可以:
server.addEventListener("msg", String.class, new DataListener<String>() {
            public void onData(SocketIOClient client, String data, AckRequest arg2) throws Exception {
                System.out.println(clientIp + ":客户端:" + data);
                client.sendEvent("msg", "客户端!!我给你返回信息了!!!!!");
            }
        });
  • 发送消息是对象时,用JSONObject就可以,但是参数的key与参数个数一定和后台对应一致,不然会发送失败

例:

                try {
                    JSONObject object = new JSONObject();
                    object.put("name", socketManager.getDyuid());
                    object.put("id", salvationId);
                } catch (JSONException e) {
                    e.printStackTrace();
                    Log.e("AAA", "异常:" + e.getMessage());
                }
                socketManager.sendMessage("messageevent", object);
  • 接收服务器的对象消息利用Gson解析为实体类对象

例:

 				try {
                        JSONObject object = (JSONObject) args[0];
                        UserBean bean = gson.fromJson(object.toString(), UserBean.class);
                        String name= bean .getName();
                    } catch (JSONException e) {
                        e.printStackTrace();
                        Log.e("AAA", "成功中抛出异常" + e.getMessage());
                    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值