【移动应用开发技术】OkSocket与Android怎么用_第1页
【移动应用开发技术】OkSocket与Android怎么用_第2页
【移动应用开发技术】OkSocket与Android怎么用_第3页
【移动应用开发技术】OkSocket与Android怎么用_第4页
【移动应用开发技术】OkSocket与Android怎么用_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】OkSocket与Android怎么用

OkSocket简介Maven配置allprojects

{

repositories

{

jcenter()

}

}dependencies

{

compile

'com.tonystark.android:socket:1.0.0'

}参数配置<uses-permission

android:name="android.permission.INTERNET"/>

<uses-permission

android:name="android.permission.ACCESS_NETWORK_STATE"/>-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

erfaces.**

{

*;

}

-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初始化public

class

MyApplication

extends

Application

{

@Override

public

void

onCreate()

{

super.onCreate();

//在主进程初始化一次,多进程时需要区分主进程.

OkSocket.initialize(this);

//如果需要开启Socket调试日志,请配置

//OkSocket.initialize(this,true);

}

}调用演示简单的长连接ConnectionManager

主要负责该地址的套接字连接断开发送消息等操作.

//连接参数设置(IP,端口号),这也是一个连接的唯一标识,不同连接,该参数中的两个值至少有其一不一样

ConnectionInfo

info

=

new

ConnectionInfo("37",

8080);

//调用OkSocket,开启这次连接的通道,调用通道的连接方法进行连接.

OkSocket.open(info).connect();有回调的长连接//连接参数设置(IP,端口号),这也是一个连接的唯一标识,不同连接,该参数中的两个值至少有其一不一样

ConnectionInfo

info

=

new

ConnectionInfo("37",

8080);

//调用OkSocket,开启这次连接的通道,拿到通道Manager

IConnectionManager

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();可配置的长连接//连接参数设置(IP,端口号),这也是一个连接的唯一标识,不同连接,该参数中的两个值至少有其一不一样

ConnectionInfo

info

=

new

ConnectionInfo("37",

8080);

//调用OkSocket,开启这次连接的通道,拿到通道Manager

IConnectionManager

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;

//...省略连接及设置回调的代码...

@Override

public

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());

}

//以上两种方法选择其一,成员变量的方式请注意判空

}如何接收数据

/upload/information/20200623/125/126002.png//设置自定义解析头

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());

//...正确设置解析头之后...

@Override

public

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;

//...省略连接及设置回调的代码...

@Override

public

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;

//当客户端收到消息后

@Override

public

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

pu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论