我的编程空间,编程开发者的网络收藏夹
学习永远不晚

OkSocket与Android怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

OkSocket与Android怎么用

这篇文章给大家分享的是有关OkSocket与Android怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

OkSocket简介

Android OkSocket是一款基于阻塞式传统Socket的一款Socket客户端整体解决方案.您可以使用它进行简单的基于Tcp协议的Socket通讯,当然,也可以进行大数据量复杂的Socket通讯,
支持单工,双工通讯.

Maven配置

OkSocket 目前仅支持 JCenter 仓库

allprojects {  repositories {    jcenter()  }}

在Module的build.gradle文件中添加依赖配置

dependencies {  compile 'com.tonystark.android:socket:1.0.0'}

参数配置

在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

混淆配置

请避免混淆OkSocket,在Proguard混淆文件中增加以下配置:

-dontwarn com.xuhao.android.libsocket.**-keep class com.xuhao.android.socket.impl.abilities.** { *; }-keep class com.xuhao.android.socket.impl.exceptions.** { *; }-keep class com.xuhao.android.socket.impl.EnvironmentalManager { *; }-keep class com.xuhao.android.socket.impl.BlockConnectionManager { *; }-keep class com.xuhao.android.socket.impl.UnBlockConnectionManager { *; }-keep class com.xuhao.android.socket.impl.SocketActionHandler { *; }-keep class com.xuhao.android.socket.impl.PulseManager { *; }-keep class com.xuhao.android.socket.impl.ManagerHolder { *; }-keep class com.xuhao.android.socket.interfaces.** { *; }-keep class com.xuhao.android.socket.sdk.** { *; }# 枚举类不能被混淆-keepclassmembers enum * {  public static **[] values();  public static ** valueOf(java.lang.String);}-keep class com.xuhao.android.socket.sdk.OkSocketOptions$* {  *;}

OkSocket初始化

将以下代码复制到项目Application类onCreate()中,OkSocket会为自动检测环境并完成配置:

public class MyApplication extends Application {  @Override  public void onCreate() {    super.onCreate();    //在主进程初始化一次,多进程时需要区分主进程.    OkSocket.initialize(this);    //如果需要开启Socket调试日志,请配置    //OkSocket.initialize(this,true);  }}

调用演示

测试服务器

该服务器是专门为初学者调试 OkSocket 库部属的一台测试服务器,初学者可以将项目中的 app 安装到手机上,点击 Connect 按钮即可,该服务器仅为熟悉通讯方式和解析方式使用.该服务器不支持心跳返回,不能作为商用服务器.服务器代码在 SocketServerDemo 文件夹中,请注意参考阅读.

IP: 104.238.184.237

Port: 8080

您也可以选择下载 JAR 文件到本地,运行在您的本地进行调试 Download JAR

下载后使用下面的代码将其运行起来java -jar SocketServerDemo.jar

简单的长连接

OkSocket 会默认对每一个 Open 的新通道做缓存管理,仅在第一次调用 Open 方法时创建 ConnectionManager 管理器,之后调用者可以通过获取到该ConnectionManager的引用,继续调用相关方法

ConnectionManager 主要负责该地址的套接字连接断开发送消息等操作.//连接参数设置(IP,端口号),这也是一个连接的唯一标识,不同连接,该参数中的两个值至少有其一不一样ConnectionInfo info = new ConnectionInfo("104.238.184.237", 8080);//调用OkSocket,开启这次连接的通道,调用通道的连接方法进行连接.OkSocket.open(info).connect();

有回调的长连接

注册该通道的监听器,每个 Connection 通道中的监听器互相隔离,因此如果一个项目连接了多个 Socket 连接需要在每个 Connection 注册自己的连接监听器,连接监听器是该 OkSocket 与用户交互的唯一途径

//连接参数设置(IP,端口号),这也是一个连接的唯一标识,不同连接,该参数中的两个值至少有其一不一样ConnectionInfo info = new ConnectionInfo("104.238.184.237", 8080);//调用OkSocket,开启这次连接的通道,拿到通道ManagerIConnectionManager manager = OkSocket.open(info);//注册Socket行为监听器,SocketActionAdapter是回调的Simple类,其他回调方法请参阅类文档manager.registerReceiver(new SocketActionAdapter(){  @Override  public void onSocketConnectionSuccess(Context context, ConnectionInfo info, String action) {   Toast.makeText(context, "连接成功", LENGTH_SHORT).show();  }});//调用通道进行连接manager.connect();

可配置的长连接

获得 OkSocketOptions 的行为属于比较高级的 OkSocket 调用方法,每个 Connection 将会对应一个 OkSocketOptions,如果第一次调用 Open 时未指定 OkSocketOptions,OkSocket将会使用默认的配置对象,默认配置请见文档下方的高级调用说明

//连接参数设置(IP,端口号),这也是一个连接的唯一标识,不同连接,该参数中的两个值至少有其一不一样ConnectionInfo info = new ConnectionInfo("104.238.184.237", 8080);//调用OkSocket,开启这次连接的通道,拿到通道ManagerIConnectionManager manager = OkSocket.open(info);//获得当前连接通道的参配对象OkSocketOptions options= manager.getOption();//基于当前参配对象构建一个参配建造者类OkSocketOptions.Builder builder = new OkSocketOptions.Builder(options);//修改参配设置(其他参配请参阅类文档)builder.setSinglePackageBytes(size);//建造一个新的参配对象并且付给通道manager.option(builder.build());//调用通道进行连接manager.connect();

如何进行数据发送

//类A://...定义将要发送的数据结构体...public class TestSendData implements ISendable {  private String str = "";  public TestSendData() {    JSONObject jsonObject = new JSONObject();    try {      jsonObject.put("cmd", 14);      jsonObject.put("data", "{x:2,y:1}");      str = jsonObject.toString();    } catch (JSONException e) {      e.printStackTrace();    }  }  @Override  public byte[] parse() {    //根据服务器的解析规则,构建byte数组    byte[] body = str.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();  }}//类B:private IConnectionManager mManager;//...省略连接及设置回调的代码...@Overridepublic void onSocketConnectionSuccess(Context context, ConnectionInfo info, String action) {   //连接成功其他操作...   //链式编程调用   OkSocket.open(info)    .send(new TestSendData());      //此处也可将ConnectManager保存成成员变量使用.   mManager = OkSocket.open(info);   if(mManager != null){    mManager.send(new TestSendData());   }   //以上两种方法选择其一,成员变量的方式请注意判空}

如何接收数据

OkSocket客户端接收服务器数据是要求一定格式的,客户端的OkSocketOptions提供了接口来修改默认的服务器返回的包头解析规则.请看下图为默认的包头包体解析规则

 OkSocket与Android怎么用

数据结构示意图

如上图包头中的内容为4个字节长度的int型,该int值标识了包体数据区的长度,这就是默认的头解析,如果需要自定义头请按照如下方法.

//设置自定义解析头OkSocketOptions.Builder okOptionsBuilder = new OkSocketOptions.Builder(mOkOptions);okOptionsBuilder.setHeaderProtocol(new IHeaderProtocol() {  @Override  public int getHeaderLength() {    //返回自定义的包头长度,框架会解析该长度的包头    return 0;  }  @Override  public int getBodyLength(byte[] header, ByteOrder byteOrder) {    //从header(包头数据)中解析出包体的长度,byteOrder是你在参配中配置的字节序,可以使用ByteBuffer比较方便解析    return 0;  }});//将新的修改后的参配设置给连接管理器mManager.option(okOptionsBuilder.build());//...正确设置解析头之后...@Overridepublic void onSocketReadResponse(Context context, ConnectionInfo info, String action, OriginalData data) {  //遵循以上规则,这个回调才可以正常收到服务器返回的数据,数据在OriginalData中,为byte[]数组,该数组数据已经处理过字节序问题,直接放入ByteBuffer中即可使用}

如何保持心跳

//类A://...定义心跳管理器需要的心跳数据类型...public class PulseData implements IPulseSendable {  private String str = "pulse";  @Override  public byte[] parse() {    byte[] body = str.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();  }}//类B:private IConnectionManager mManager;private PulseData mPulseData = new PulseData;//...省略连接及设置回调的代码...@Overridepublic void onSocketConnectionSuccess(Context context, ConnectionInfo info, String action) {   //连接成功其他操作...   //链式编程调用,给心跳管理器设置心跳数据,一个连接只有一个心跳管理器,因此数据只用设置一次,如果断开请再次设置.   OkSocket.open(info)    .getPulseManager()    .setPulseSendable(mPulseData)    .pulse();//开始心跳,开始心跳后,心跳管理器会自动进行心跳触发           //此处也可将ConnectManager保存成成员变量使用.   mManager = OkSocket.open(info);   if(mManager != null){    PulseManager pulseManager = mManager.getPulseManager();    //给心跳管理器设置心跳数据,一个连接只有一个心跳管理器,因此数据只用设置一次,如果断开请再次设置.    pulseManager.setPulseSendable(mPulseData);    //开始心跳,开始心跳后,心跳管理器会自动进行心跳触发    pulseManager.pulse();   }   //以上两种方法选择其一,成员变量的方式请注意判空}

心跳接收到了之后需要进行喂狗

因为我们的客户端需要知道服务器收到了此次心跳,因此服务器在收到心跳后需要进行应答,我们收到此次心跳应答后,需要进行本地的喂狗操作,否则当超过一定次数的心跳发送,未得到喂狗操作后,狗将会将此次连接断开重连.

//定义成员变量private IConnectionManager mManager;//当客户端收到消息后@Overridepublic void onSocketReadResponse(Context context, ConnectionInfo info, String action, OriginalData data) {  if(mManager != null && 是心跳返回包){//是否是心跳返回包,需要解析服务器返回的数据才可知道    //喂狗操作    mManager.getPulseManager().feed();  }}

如何手动触发一次心跳,在任何时间

//定义成员变量private IConnectionManager mManager;//...在任意地方...mManager = OkSocket.open(info);if(mManager != null){  PulseManager pulseManager = mManager.getPulseManager();  //手动触发一次心跳(主要用于一些需要手动控制触发时机的场景)  pulseManager.trigger();}

OkSocket参配选项及回调说明

OkSocketOptions

  1. Socket通讯模式mIOThreadMode

  2. 连接是否管理保存isConnectionHolden

  3. 写入字节序mWriteOrder

  4. 读取字节序mReadByteOrder

  5. 头字节协议mHeaderProtocol

  6. 发送单个数据包的总长度mSendSinglePackageBytes

  7. 单次读取的缓存字节长度mReadSingleTimeBufferBytes

  8. 脉搏频率间隔毫秒数mPulseFrequency

  9. 脉搏最大丢失次数(狗的失喂次数)mPulseFeedLoseTimes

  10. 后台存活时间(分钟)mBackgroundLiveMinute

  11. 连接超时时间(秒)mConnectTimeoutSecond

  12. 最大读取数据的兆数(MB)mMaxReadDataMB

  13. 重新连接管理器mReconnectionManager

ISocketActionListener

  1. Socket读写线程启动后回调onSocketIOThreadStart

  2. Socket读写线程关闭后回调onSocketIOThreadShutdown

  3. Socket连接状态由连接->断开回调onSocketDisconnection

  4. Socket连接成功回调onSocketConnectionSuccess

  5. Socket连接失败回调onSocketConnectionFailed

  6. Socket从服务器读取到字节回调onSocketReadResponse

  7. Socket写给服务器字节后回调onSocketWriteResponse

  8. 发送心跳后的回调onPulseSend

Copyright [2017] [徐昊]  Licensed under the Apache License, Version 2.0 (the "License");  you may not use this file except in compliance with the License.  You may obtain a copy of the License at   http://www.apache.org/licenses/LICENSE-2.0  Unless required by applicable law or agreed to in writing, software  distributed under the License is distributed on an "AS IS" BASIS,  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the specific language governing permissions and  limitations under the License.

感谢各位的阅读!关于“OkSocket与Android怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

OkSocket与Android怎么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

OkSocket与Android怎么用

这篇文章给大家分享的是有关OkSocket与Android怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。OkSocket简介Android OkSocket是一款基于阻塞式传统Socket的一款Socket
2023-05-30

Android startActivityForResult怎么调用与封装

今天小编给大家分享一下Android startActivityForResult怎么调用与封装的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们
2023-07-05

Android系统中view与SurfaceView怎么用

这篇文章给大家分享的是有关Android系统中view与SurfaceView怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、引入:Android提供了View来进行绘图处理,在大部分情况下,View都能
2023-06-29

Android RxJava与Retrofit怎么结合使用

本篇内容介绍了“Android RxJava与Retrofit怎么结合使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!添加依赖compil
2023-07-05

Android OkHttp代理与路由怎么应用

本文小编为大家详细介绍“Android OkHttp代理与路由怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android OkHttp代理与路由怎么应用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。代
2023-07-05

Android UI设计与开发之ViewPager怎么用

这篇文章主要介绍了Android UI设计与开发之ViewPager怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、ViewPager实现的效果图 二、ViewPa
2023-05-30

Android应用中怎么实现与H5互调

Android应用中怎么实现与H5互调?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。案例一:Java与Js简单互调 首先,在Android代码中加
2023-05-31

Android Loop机制中Looper与handler怎么使用

今天小编给大家分享一下Android Loop机制中Looper与handler怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了
2023-07-04

android怎么与HTML混合开发

今天就跟大家聊聊有关android怎么与HTML混合开发,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、关于HTML5种cookie网页中可能会用到 用户信息等很多参数,可以提前把
2023-06-09

Android应用中怎么利用WebView与Javascript进行交互

Android应用中怎么利用WebView与Javascript进行交互?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Android中可以使用WebView加载网页,同时And
2023-05-31

Naive与WebView在Android中怎么实现互相调用

本篇文章为大家展示了Naive与WebView在Android中怎么实现互相调用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android Naive与WebView的互相调用详解Android
2023-05-31

Android Room怎么用

小编给大家分享一下Android Room怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!官网介绍:developer.android.google.cn/t
2023-06-14

android application怎么用

要使用Android应用程序,您可以按照以下步骤进行操作:1. 在Google Play商店或其他应用市场上下载和安装您想要使用的应用程序。您可以在应用市场中搜索应用程序的名称或关键字,然后点击安装按钮进行安装。2. 安装完成后,您可以在设
2023-10-10

怎么在Android中利用Activity实现跳转与传值

今天就跟大家聊聊有关怎么在Android中利用Activity实现跳转与传值,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android Activity的跳转与传值详解Activi
2023-05-31

怎么在Android中利用FloatingActionButton实现显示与隐藏

本篇文章为大家展示了怎么在Android中利用FloatingActionButton实现显示与隐藏,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。FloatingActionButton简介Floa
2023-05-30

Android中怎么解决 ListView与getView调用卡顿问题

本篇文章给大家分享的是有关Android中怎么解决 ListView与getView调用卡顿问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Android ListView与
2023-05-30

android inflate怎么使用

在Android中,inflate方法用于将XML布局文件转换为View对象。以下是使用inflate方法的示例:1. 在Java代码中使用inflate方法:```javaLayoutInflater inflater = (Layout
2023-10-07

Android Room怎么使用

今天小编给大家分享一下Android Room怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。@ForeignKey和
2023-07-05

Android CoordinatorLayout怎么使用

CoordinatorLayout是一个布局容器,它可以协调子视图的位置和行为。它是Android Design Support Library中的一个组件,用于实现复杂的交互效果和动画。使用CoordinatorLayout需要以下步骤:
2023-08-16

Android Preference怎么使用

使用Android Preference主要包括以下几个步骤:1. 创建一个Preference XML文件:在res/xml目录下创建一个XML文件,定义Preference的结构和属性。2. 创建一个PreferenceFragment
2023-08-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录