# SocketLibDemo **Repository Path**: xinyidev/tcp-lib-demo ## Basic Information - **Project Name**: SocketLibDemo - **Description**: Socket相关的框架及演示demo,包括: Tcp Server和client端的框架及演示demo Udp 发送和接收端的框架及演示demo - **Primary Language**: Android - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 1 - **Created**: 2021-01-18 - **Last Updated**: 2023-10-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SocketLibDemo #### 介绍 Socket相关的框架及演示demo,包括: Tcp Server和client端的框架及演示demo Udp 发送和接收端的框架及演示demo 仓库地址:https://gitee.com/xinyidev/tcp-lib-demo #### 版本更新 2021.1.21:完成一对多演示demo,整体框架稳定性、抗压力测试完毕。基本具备可试用条件。 2021.1.22:客户端增加网络断开、又重新连接上,socket自动重新连接机制,机制可控制,重新连接间隔可配置。 2021.1.25:去掉Tcp框架识别对方主动断开机制,改由在业务层通过心跳包机制实时判断socket连接状态。 2021.2.24: 增加Udp框架及demo,协议解析基类增加一个对纯byte[]处理的接口,兼容udp协议数据解析。 #### 软件架构 ##### tcp_client_master Tcp客户端框架 ##### tcp_server_master Tcp服务端框架,支持一对多。 ##### app_tcp_client Tcp客户端demo ##### app_tcp_server Tcp服务端demo ##### udp_receiver_master Udp接收端框架 ##### udp_sender_master Udp发送端框架 ##### app_udp_device1 Udp 设备1,同时具备发送和接收功能。 ##### app_udp_device2 Udp 设备2,同时具备发送和接收功能。 ##### protocol_base 协议解析基类 ##### protocol_service 具体的协议解析的业务,处理了连包等问题,没有任何的sleep时间,尽可能快速的解析出一帧数据。 #### 框架使用教程 注意所有的回调接口都是在子线程,如果要更新UI请自行切换线程处理。 ##### Tcp客户端框架 1.建立连接及接收消息 ```java tcpSocketClient = new TcpSocketClient(); tcpSocketClient.setOnClientStatusListener(new TcpSocketClient.OnClientStatusListener() { @Override public void onRead(InputStream in) { //这里做自己业务的协议解析 protocolHandlerSingleton.get().handle(in); } @Override public void onConnecting() { LogUtil.d("正在连接"); runOnUiThread(new Runnable() { @Override public void run() { tvState.setText("正在连接"); } }); } @Override public void onConnected() { LogUtil.d("连接成功"); isConnected = true; runOnUiThread(new Runnable() { @Override public void run() { tvState.setText("连接成功"); } }); } @Override public void onConnectFailed(final Throwable e) { LogUtil.d("连接失败:" + e.getMessage()); runOnUiThread(new Runnable() { @Override public void run() { tvState.setText("连接失败:" + e.getMessage()); } }); } @Override public void onError(final Throwable e) { LogUtil.d("异常:" + e.getMessage()); runOnUiThread(new Runnable() { @Override public void run() { tvState.setText("异常:" + e.getMessage()); } }); protocolHandlerSingleton.get().release(); } @Override public void onDisconnect(final Throwable e) { LogUtil.d("连接异常断开:" + e.getMessage()); isConnected = false; runOnUiThread(new Runnable() { @Override public void run() { tvState.setText("连接异常断开:" + e.getMessage()); btnControl.setText("连接"); } }); protocolHandlerSingleton.get().release(); } @Override public void onDisconnected() { LogUtil.d("连接断开"); isConnected = false; runOnUiThread(new Runnable() { @Override public void run() { tvState.setText("连接断开"); } }); protocolHandlerSingleton.get().release(); } @Override public void onSendMsgFailure(final Throwable e) { LogUtil.d("发送消息失败:" + e.getMessage()); runOnUiThread(new Runnable() { @Override public void run() { tvState.setText("发送消息失败:" + e.getMessage()); } }); } }); tcpSocketClient.connect("127.0.0.1", 9999); ``` 2.发送消息 ```java tcpSocketClient.send(cmd); ``` 3.关闭连接 ```java tcpSocketClient.stop(); ``` 4.释放资源 ```java tcpSocketClient.release(); ``` 5.开启重连机制 ```java tcpSocketClient.setAutoReconnect(true); ``` ##### Tcp服务端框架 1.建立连接及监听服务端状态、客户端状态 ```java tcpSocketServer = new TcpSocketServer(9999); final String ip = NetUtil.getIp(MainActivity.this); tcpSocketServer.listenServer(new TcpSocketServer.OnServerStatusListener() { @Override public void onServerStarted() { runOnUiThread(new Runnable() { @Override public void run() { tvState.setText("服务" + ip + "已经开启"); btnServerControl.setText("关闭服务"); } }); } @Override public void onServerClosed() { runOnUiThread(new Runnable() { @Override public void run() { tvState.setText("服务" + ip + "已经关闭"); btnServerControl.setText("开启服务"); } }); } }); tcpSocketServer.listenClient(new TcpClientItem.OnClientStatus() { @Override public void onJoined(final TcpClientItem client) { clientPool.join(client); } @Override public void onDisconnected(final TcpClientItem client) { clientPool.leave(client); } @Override public void onDisconnect(final TcpClientItem client, Throwable e) { clientPool.leave(client); } @Override public void onError(final TcpClientItem client, final Throwable e) { } @Override public void onReceive(TcpClientItem client, InputStream in) { clientPool.get(client.getAddress()).protocolHandlerSingleton.get().handle(in); } }); tcpSocketServer.enableServer(); ``` 2.客户端操作 2-1.发送消息至客户端 ```java tcpClientItem.send(cmd); ``` 2-2.关闭客户端 ```java tcpClientItem.closeClient(); ``` 3.关闭服务端 ```java tcpSocketServer.closeServer(); ``` 4.释放资源 ```java tcpSocketServer.release(); ``` ##### Udp接收端框架 1.创建并启动udp接收端对象 ```java udpReceiver = new UdpReceiver(9999); udpReceiver.listenReceiver(new UdpReceiver.OnReceiverStatusListener() { @Override public void onReceiverStarted() { //启动协议解析 protocolHandlerSingleton.get().start(); } @Override public void onReceiverClosed() { } @Override public void onRead(final byte[] buffer) { protocolHandlerSingleton.get().handle(buffer); } }); udpReceiver.enableReceiver(); ``` 2.释放资源 ```java udpReceiver.release(); ``` ##### Udp发送端框架 1.创建udp发送端对象 通过构造参数传入目标对象的ip地址和端口 ```java udpSender = new UdpSender("10.14.207.79", 9999); ``` 2.监听udp发送状态 ```java udpSender.setOnSenderStatusListener(new UdpSender.OnSenderStatusListener() { @Override public void onError(Throwable e) { sb.append("发送异常:" + e.getMessage()); runOnUiThread(new Runnable() { @Override public void run() { tvRecv.setText(sb.toString()); } }); } @Override public void onSendMsgFailure(Throwable e) { sb.append("发送失败:" + e.getMessage()); runOnUiThread(new Runnable() { @Override public void run() { tvRecv.setText(sb.toString()); } }); } }); ``` 3.发送数据 发送数据有2个接口,直接发送String或者byte[] ```java udpSender.send("#{I'm AAAAAAAA}#"); ```