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() {
@Override
public int getHeaderLength() {
return 0;
}
@Override
public int getBodyLength(byte[] header, ByteOrder byteOrder) {
return 0;
}
})
.setWriterProtocol(new IWriterProtocol() {
@Override
public byte[] getHeaderBytes(ISendable sendable) {
return new byte[0];
}
@Override
public 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() {
@Override
public void onSocketConnectionSuccess(ConnectionInfo info, String action) {
}
@Override
public void onSocketConnectionFailed(ConnectionInfo info, String action, Exception e) {
}
@Override
public void onSocketDisconnection(ConnectionInfo info, String action, Exception e) {
}
@Override
public void onSocketReadResponse(ConnectionInfo info, String action, OriginalData data) {
// 处理接收到的数据
}
@Override
public void onSocketWriteResponse(ConnectionInfo info, String action, ISendable data) {
}
@Override
public 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() {
@Override
public int getHeaderLength() {
return 8;
}
@Override
public int getBodyLength(byte[] header, ByteOrder byteOrder) {
ByteBuffer buffer = ByteBuffer.wrap(header);
buffer.order(byteOrder);
int bodyLength = buffer.getInt();
return bodyLength;