> 文章列表 > OkSocket

OkSocket

OkSocket

OkSocket 是一个 Android 平台下的 TCP 库,它封装了 Java NIO、Okio 等多种实现方式,并提供了易用的 API,使得开发者能够轻松实现消息的发送和接收。OkSocket 主要特点包括:多线程处理、次数重连、心跳包检测、消息粘包处理和断线重连等。接下来,我将详细介绍 OkSocket 在 Android 应用中的使用方法

1. 添加依赖

在项目的 build.gradle 中添加以下依赖:

dependencies {implementation 'com.github.xiaobailong24:OkSocket:4.4.0'
}

2. 创建连接

创建连接需要使用 ConnectionInfo 对象和 OkSocket.Builder 构建器,举个例子:

ConnectionInfo info = new ConnectionInfo("192.168.0.1", 8080);
OkSocketOptions options = new OkSocketOptions.Builder().build();
OkSocket.open(info).option(options).createConnection();

以上代码表示创建一个连接到 192.168.0.1:8080 的 TCP 连接,并开启默认配置的 OkSocket 实例。创建连接有两个方法,分别是 createConnection 和 createConnectionBuilder。其中,前者会在创建连接之后自动启动连接,后者需要手动调用 start 方法才会启动连接。

3. 设置连接参数

OkSocket 提供了多种可配置的连接参数,可以通过 OkSocketOptions.Builder 构建器进行设置。例如:

OkSocketOptions options = new OkSocketOptions.Builder().setSinglePackageBytes(1024).setConnectTimeoutSecond(10).setMaxReadDataMB(10).setReaderProtocol(new IReaderProtocol() {@Overridepublic int getHeaderLength() {return 0;}@Overridepublic int getBodyLength(byte[] header, ByteOrder byteOrder) {return 0;}}).setWriterProtocol(new IWriterProtocol() {@Overridepublic byte[] getHeaderBytes(ISendable sendable) {return new byte[0];}@Overridepublic byte[] getFooterBytes(ISendable sendable) {return new byte[0];}}).setPulseFrequency(60000).build();

以上代码设置了单包最大字节数为1024,连接超时时间为10秒,客户端最多缓存10MB的读取数据,读取数据时使用自定义的 IReaderProtocol 解析接收到的数据包,发送数据时使用自定义的 IWriterProtocol 封装数据包,每隔60秒向服务器发送一次心跳包。

4. 发送数据

OkSocket 支持发送多种类型的数据,包括字符串、字节数组、文件等。发送数据需要先构建一个 ISendable 实例,然后使用 send 方法发送即可。例如:

OkSocketTask task = OkSocket.open(info).createConnection();
StringSendablePacket packet = new StringSendablePacket("hello world");
task.send(packet);

以上代码表示创建一个字符串类型的数据包,发送数据使用 send 方法。目前,OkSocket 支持以下类型的 ISendable 数据:

  • ByteArraySendablePacket:字节数组类型的数据包。
  • FileSendablePacket:文件类型的数据包。
  • StringSendablePacket:字符串类型的数据包。
  • ByteBufferSendablePacket:ByteBuffer 类型的数据包。
  • OkSocketOptions.Builder#writerProtocol 新添加的类型。

5. 接收数据

在接收数据时,需要实现一个 IReceiver 接口,重写其中的事件回调方法,例如:

OkSocketTask task = OkSocket.open(info).createConnection();
task.registerReceiver(new IReceiver() {@Overridepublic void onSocketConnectionSuccess(ConnectionInfo info, String action) {}@Overridepublic void onSocketConnectionFailed(ConnectionInfo info, String action, Exception e) {}@Overridepublic void onSocketDisconnection(ConnectionInfo info, String action, Exception e) {}@Overridepublic void onSocketReadResponse(ConnectionInfo info, String action, OriginalData data) {// 处理接收到的数据}@Overridepublic void onSocketWriteResponse(ConnectionInfo info, String action, ISendable data) {}@Overridepublic void onPulseSend(ConnectionInfo info, IPulseSendable data) {}
})
.setOkOptions(options)
.start();

以上代码表示创建一个 IReceiver 实例,处理连接成功、连接失败、连接断开、接收到数据和发送数据等事件。其中,onSocketReadResponse 方法中的 OriginalData 类型表示接收到的原始数据,开发者可以根据需要对其进行解析。

6. 调用方法

在创建连接之后,可以调用以下方法进行操作:

  • send(ISendable):发送数据。
  • disconnect(int, Exception):主动断开连接。
  • isClosed():返回当前连接是否已关闭。
  • isPaused():返回当前连接是否已暂停。
  • pauseReconnect():暂停重连。
  • resumeReconnect():恢复重连。
  • getLocalAddress():获取本地 IP 地址。
  • getRemoteAddress():获取远程 IP 地址。
  • getOption():获取当前使用的 OkSocketOptions 实例。
  • getRunningThread():获取当前使用的线程。
  • getPulseManager():获取当前连接的心跳管理器。

7. 高级用法

需要注意的是,OkSocket 可以高度自定义,支持使用自定义协议和数据的发送和接收,这是一个高级用法。开发者可以通过实现 IReaderProtocol 和 IWriterProtocol 接口,在其中自定义数据的解析和封装方式。例如:

OkSocketOptions options = new OkSocketOptions.Builder().setReaderProtocol(new IReaderProtocol() {@Overridepublic int getHeaderLength() {return 8;}@Overridepublic int getBodyLength(byte[] header, ByteOrder byteOrder) {ByteBuffer buffer = ByteBuffer.wrap(header);buffer.order(byteOrder);int bodyLength = buffer.getInt();return bodyLength;