Android中OkSocket的配置和使用

一、OkSocket简介

  • OkSocket是一款基于阻塞式传统Socket的一款Socket客户端整体解决方案.你可以使用它进行基于Tcp协议的Socket通讯.就是我们所说的长连接.
  • 对通讯协议几乎无限制,可以使用PB,可以使用JSON,可以使用XML.只要可以序列化成Byte数组的对象都可以传输.
  • 兼容所有语言写的Socket服务端,解决了Tcp通讯中头疼的粘包拆包问题,断线重连问题,心跳保持问题,分片发送,重定向连接等问题.
  • 针对 手机 < - > 服务器 , 手机< - > 手机 间都可以进行tcp通讯,手机间通讯俗称点对点通讯,可以很好的支持.
  • OkSocket还支持单工和全双工通讯.适配各种复杂业务场景.分为 客户端(OkSocketClient) 服务端(OkSocketServer)具体的继承和依赖方法在下面.

二、配置

配置仓库


加入proguard-rules.pro内容,避免混淆

-dontwarn com.xuhao.didi.socket.client.**
-dontwarn com.xuhao.didi.socket.common.**
-dontwarn com.xuhao.didi.socket.server.**
-dontwarn com.xuhao.didi.core.**-keep class com.xuhao.didi.socket.client.** { *; }
-keep class com.xuhao.didi.socket.common.** { *; }
-keep class com.xuhao.didi.socket.server.** { *; }
-keep class com.xuhao.didi.core.** { *; }-keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);
}
-keep class com.xuhao.didi.socket.client.sdk.client.OkSocketOptions$* {*;
}
-keep class com.xuhao.didi.socket.server.impl.OkServerOptions$* {*;
}

三、服务端

服务端初始化代码

server = OkSocket.server(30012); // 创建服务器
IServerManager serverManager = server.registerReceiver(serverActionListener);// 注册回调
serverManager.listen();// 开启监听

服务端反初始化代码

server.unRegisterReceiver(serverActionListener); // 解除注册

服务端回调监听代码

IRegister server;
IServerActionListener serverActionListener = new IServerActionListener() {@Overridepublic void onServerListening(int serverPort) {Log.d(TAG,"服务器启动完成.正在监听端口:" + serverPort);}@Overridepublic void onClientConnected(IClient client, int serverPort, IClientPool clientPool) {Log.d(TAG, client.getUniqueTag() + " 客户端已连接");client.addIOCallback(new IClientIOCallback() {@Overridepublic void onClientRead(OriginalData originalData, IClient client, IClientPool clientPool) {String str = new String(originalData.getBodyBytes(), Charset.forName("utf-8"));if(str.equals("pause")){ //是否是心跳返回包,若是心跳包则发送应答包Log.d(TAG,"收到客户端"+client.getUniqueTag()+"的心跳数据:"+str);client.send(new ISendable() {@Overridepublic byte[] parse() {byte[] body = "ack".getBytes(Charset.defaultCharset()); // 心跳响应数据ByteBuffer bb = ByteBuffer.allocate(4 + body.length);bb.order(ByteOrder.BIG_ENDIAN);bb.putInt(body.length);bb.put(body);return bb.array();}});}else {Log.d(TAG,"收到客户端"+client.getUniqueTag()+"的指令");}}@Overridepublic void onClientWrite(ISendable sendable, IClient client, IClientPool clientPool) {Log.d(TAG,"发送数据到客户端:"+new String(sendable.parse(),Charset.forName("utf-8")));}});}@Overridepublic void onClientDisconnected(IClient client, int serverPort, IClientPool clientPool) {Log.d(TAG, client.getUniqueTag() + " 客户端已断开连接");client.removeAllIOCallback();}@Overridepublic void onServerWillBeShutdown(int serverPort, IServerShutdown shutdown, IClientPool clientPool, Throwable throwable) {Log.d(TAG, "服务器即将关闭");}@Overridepublic void onServerAlreadyShutdown(int serverPort) {Log.d(TAG, "服务器已经关闭,serverPort="+serverPort);}
};

四、客户端

客户端初始化代码

ConnectionInfo info = new ConnectionInfo("192.168.43.1", 30012);//连接参数设置(IP,端口号)
mManager = OkSocket.open(info);//调用OkSocket,开启这次连接的通道,拿到通道Manager
mManager.registerReceiver(socketActionAdapter);//注册Socket行为监听器
mManager.connect();//调用通道进行连接

客户端发送数据

客户端反初始化代码

mManager.disconnect();//断开连接
mManager.unRegisterReceiver(socketActionAdapter); // 取消注册监听

客户端回调代码

IConnectionManager mManager;
SocketActionAdapter socketActionAdapter = new SocketActionAdapter() {@Overridepublic void onSocketIOThreadStart(String action) {super.onSocketIOThreadStart(action);}@Overridepublic void onSocketIOThreadShutdown(String action, Exception e) {super.onSocketIOThreadShutdown(action, e);}@Overridepublic void onSocketDisconnection(ConnectionInfo info, String action, Exception e) {super.onSocketDisconnection(info, action, e);//断开连接Log.d(TAG, "断开服务器连接");}@Overridepublic void onSocketConnectionSuccess(ConnectionInfo info, String action) {super.onSocketConnectionSuccess(info, action);Log.d(TAG, "客户端连接服务器成功,开启心跳");//连接成功,开启心跳OkSocket.open(info).getPulseManager().setPulseSendable(new IPulseSendable() {@Overridepublic byte[] parse() {byte[] body = "pause".getBytes(Charset.defaultCharset()); // 心跳数据ByteBuffer bb = ByteBuffer.allocate(4 + body.length);bb.order(ByteOrder.BIG_ENDIAN);bb.putInt(body.length);bb.put(body);return bb.array();}}).pulse();//开始心跳,开始心跳后,心跳管理器会自动进行心跳触发}@Overridepublic void onSocketConnectionFailed(ConnectionInfo info, String action, Exception e) {super.onSocketConnectionFailed(info, action, e);Log.d(TAG, "客户端连接服务器失败");}@Overridepublic void onSocketReadResponse(ConnectionInfo info, String action, OriginalData data) {String str = new String(data.getBodyBytes(), Charset.forName("utf-8"));Log.d(TAG, "客户端读取数据回调" + str);if (mManager != null && str.equals("ack")) {//是否是心跳返回包,需要解析服务器返回的数据才可知道Log.d(TAG, "客户端喂狗");//喂狗操作mManager.getPulseManager().feed();}super.onSocketReadResponse(info, action, data);}@Overridepublic void onSocketWriteResponse(ConnectionInfo info, String action, ISendable data) {Log.d(TAG, "客户端发送数据回调");super.onSocketWriteResponse(info, action, data);}@Overridepublic void onPulseSend(ConnectionInfo info, IPulseSendable data) {Log.d(TAG, "客户端发送心跳包");super.onPulseSend(info, data);}
};


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部