vilyever / androidsocketclient Goto Github PK
View Code? Open in Web Editor NEWSocket封装
Socket封装
这个库功能有点复杂,现在卡在ReadStrategy了,我需要的很简单,就是收到什么就返回什么,收到多少就立刻返回多少,不需要包头包尾包长之类的。找了半天似乎没发现有这个模式,除了自己改以外,有没有简单的方法?谢谢!
心跳包只能是字符串吗?
现在遇到个问题:发送一个字符串 "7D82010000107702200435009B7A7D" ,我采用下面两种方式:
1 字符串转化为16进制字节数组,然后 >mSocketClient.send(mBytes)
2 设置该字符串为心跳包
这两个发送的数据不一样,设置编码格式为gbk和utf-8都不一样,求破?
我这边真机一连上就断开链接,然后我在断开链接里面重复去去链接,循环几次之后,会连上,然后,一发送数据,又直接断开链接,请问出现这种情况的原因有哪些呢?真机确实有网。
客户端没有向服务端发送数据,但是日志里面有下面的日志,这是为什么?求解释
onReceive:SocketClient: onReceivePacketBegin: 1113338328
03-03 14:31:06.369 9766-9766/com.hthy.qihuo E/lmb: onSend:SocketClient: onSendPacketBegin: 1113371672 [72, 101, 97, 114, 116, 66, 101, 97, 116]
03-03 14:31:06.379 9766-9766/com.hthy.qihuo E/lmb: onSend:SocketClient: onSendingPacketInProgress: 1113371672 : 0.0 : 0
03-03 14:31:06.379 9766-9766/com.hthy.qihuo E/lmb: onSend:SocketClient: onSendingPacketInProgress: 1113371672 : 0.4642857 : 13
03-03 14:31:06.379 9766-9766/com.hthy.qihuo E/lmb: onSend:SocketClient: onSendingPacketInProgress: 1113371672 : 0.60714287 : 17
03-03 14:31:06.379 9766-9766/com.hthy.qihuo E/lmb: onSend:SocketClient: onSendingPacketInProgress: 1113371672 : 0.89285713 : 25
03-03 14:31:06.379 9766-9766/com.hthy.qihuo E/lmb: onSend:SocketClient: onSendingPacketInProgress: 1113371672 : 0.9285714 : 26
服务端发送字符串:33\r\n
SocketClient
客户端利用 SocketDelegate
的 onResponse
方法接收不到数据?
getLocalSocketClient().registerSocketDelegate(new SocketClient.SocketDelegate() {
@Override
public void onConnected(SocketClient client) {
Log.d("jpjpjp", "localSocketClient onConnected");
}
@Override
public void onDisconnected(SocketClient client) {
Log.w("jpjpjp", "localSocketClient onDisconnected");
}
@Override
public void onResponse(SocketClient client, @NonNull String response) {
Log.i("jpjpjp", "localSocketClient onResponse \n" + response);//获取不到数据
}
});
@vilyever 在接收服务器返回消息时,出现了数据丢失,请问有可能是什么问题呢?
1、当不设置读取方式的时候,只在接收超过15个字节的时候可以接收,而且接收后断连。当修改disconnect时,第二次数据接受不成功
2、当设置按长度接收数据的时候,数据不能接收。
公司服务器是 C 写的有自定义协议:格式是module_type类型和mess_length数据长度,请问是用哪个方法
刚使用了下,遇到个问题:
SocketClient
的构造方法
public SocketClient(@NonNull String remoteIP, int remotePort) {
this(remoteIP, remotePort, DefaultConnectionTimeout);
}
里面的第一个参数是客户端的 ip ?我现在是用一个调试工具,建了个 socket 服务端:
我如下使用
mSocketClient = new SocketClient("192.168.1.108", 60000);
mSocketClient.connect();
结果是未连接,该如何操作呢?
Socket客户端与服务端连接,长时间运行后,客户端会报错, 下面代码第一行报错:
if (getSocketConfigure().getSocketPacketHelper().isSendTimeoutEnabled()
&& getLastSendMessageTime() != NoSendingTime) {
if (currentTime - getLastSendMessageTime() >= getSocketConfigure().getSocketPacketHelper().getSendTimeout()) {
disconnect();
}
}
报错如下:
10-11 09:10:55.186 24080-5718/com.njsyg.myapplication E/AndroidRuntime: FATAL EXCEPTION: Thread-1887
java.lang.NullPointerException
at com.vilyever.socketclient.SocketClient.__i__onTimeTick(SocketClient.java:954)
at com.vilyever.socketclient.SocketClient.access$600(SocketClient.java:33)
at com.vilyever.socketclient.SocketClient$5$1.run(SocketClient.java:455)
at java.lang.Thread.run(Thread.java:856)
现在我的问题是心跳包包含消息流水号,心跳包每次都是变化的
我现在的处理是每隔一段时间发送数据,把该数据作为心跳包
请问还有没有别的方式?
请问是只有android端用就好还是服务端必须也用
刚更新到1.5.1
发送字节数组可以有三个方法:
mSocketClient.sendBytes(mBytes);
mSocketClient.send(mBytes);
mSocketClient.sendData(mBytes);
看了下,都是调用 sendData
方法,这样有什么好处呢?
sendString 同样的东西。
个人感觉各一个就够了:
sendString
和 sendBytes
有处理粘包问题没?
没有重连机制吗
最近我在做一个需要各种维持长连接的应用,同时要用到mqtt和socket。在研究eclipse.paho的mqtt client的时候,我发现在一些机型上,即使发送心跳,安卓系统也有可能让网络连接休眠,从而导致连接中断。paho默认是使用Timer来控制心跳发送的。我经过尝试和研究,发现使用AlarmManager来控制定时发送可以有效避免这种问题。paho的设计非常完善,心跳包发送的模块是可插拔的,可以自己插入一个实现了MqttPingSender接口的对象来控制发送心跳。于是很轻松的在不破坏源码的情况下用Alarm机制替换了原来的Timer机制。我在学习您的源代码过程中,看到您的心跳机制是使用了Handler.postDelayed的机制,经过实验,发现和Timer会导致一样的问题。希望您看到后有空能实验一下。^_^(我认为很可能Alarm机制不占用CPU资源,从而能达到更好的省电效果,从而避免了被系统列入高耗电后台应用从而导致被限制的情况)
我只有android客户端使用了socketclient中的代码,但是和服务端不能交互了,是不是这个不适用啊?
在SocketInputReader.java下,readBytes方法117行,list.add((byte) c)这行会导致汉字乱码,
应该替换成
if (!Character.isIdeographic(c)) {
list.add((byte) c);
} else {
byte[] bytes = new String(new char[] { (char) c }).getBytes("UTF-8");
for (byte b : bytes) {
list.add(b);
}
}
有其它更好的方式吗?
setReceiveTrailerData(new byte[]{0x77})
这样,如果接收到的数据是[0x33, 0x77, 0x44, 0x55, 0x77], 数据会被截断,导致出错
不管有没有在setDefaultSendData添加包尾,针对心跳指令发送完成监听都是null,求解
看到文档中只提到:socketClient.setHeartBeatInterval(1000 * 30); // 设置心跳包发送间隔
那么如何自定义它的发送格式?因为有时候会根据服务端设置
公司服务器是 C 写的有自定义协议:格式是module_type类型和mess_length数据长度,请问是用哪个方。。还有就是getInputStream和getOutputStream这些我都不用写了吗?
这是什么问题引起的呢?
RT
socketClient.getHeartBeatHelper().setDefaultSendData(HBBytes);//字节数组心跳包
socketClient.getHeartBeatHelper().setHeartBeatInterval(5 * 1000); // 设置自动发送心跳包的间隔时长,单位毫秒
socketClient.getHeartBeatHelper().setSendHeartBeatEnabled(true); // 设置允许自动发送心跳包,此值默认为false
2.0.3时,发送字符数组心跳包,正常接收
java.lang.NullPointerException
Attempt to invoke virtual method 'com.vilyever.socketclient.helper.SocketPacketHelper$ReadStrategy com.vilyever.socketclient.helper.SocketPacketHelper.getReadStrategy()' on a null object reference
com.vilyever.socketclient.SocketClient$ReceiveThread.run(SocketClient.java:1216)
现在只能发送成功,接收不到
简单的与服务器连接,下面几句够了吗?为啥我连接不上,在监听逻辑里 回调不了,希望大神说明下
if (localSocketClient == null) {
this.localSocketClient = new SocketClient();
socketClient.getAddress().setRemoteIP(AppConfig.REMOTE_IP); // 远程端IP地址
socketClient.getAddress().setRemotePort("8911"); // 远程端端口号
socketClient.getAddress().setConnectionTimeout(15 * 1000); // 连接超时时长,单位毫秒
}
大侠,怎么自定义通讯协议啊,
正常socket客户端与公网服务器连接以后,这时断掉手机wifi或者移动数据以后后会不停地发送消息,请问怎么解决
localSocketClient.disconnect();
你好 我不知道哪里没有弄好 接收不到数据 自己写的socket就可以 demo也看不出来哪里的问题 请问除了文档上 还有什么地方需要配置一下呢
我注意到,该库发送和接收都是 utf-8 编码,我们的数据需要 gbk 编码
问题是:发送和接收的时候,可否指定编码格式?:laughing: :laughing:
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() at android.os.Handler.<init>(Handler.java:200) at android.os.Handler.<init>(Handler.java:114) at android.os.CountDownTimer$1.<init>(CountDownTimer.java:114) at android.os.CountDownTimer.<init>(CountDownTimer.java:114) at com.vilyever.socketclient.SocketClient$5.<init>(SocketClient.java:449) at com.vilyever.socketclient.SocketClient.getHearBeatCountDownTimer(SocketClient.java:449) at com.vilyever.socketclient.SocketClient$DisconnectionThread.run(SocketClient.java:1048)
注释心跳功能相关代码后,运行(暂时)正常
我使用这个库,可以实现send操作,但是试过设置各种ReadStrategy,在通用回调里onResponse收不到任何信息.ios的同事可以收到socket服务端推过来的,但我就收不到.连onResponse打Log都没有触发,是否有什么必要条件要先配置,才能触发接收?
瞄了一眼,看来也是基于java.net.socket的,而java.net.socket有个扩展javax.net.ssl.SSLSocket是可以跑ssl、tls的,希望可以支持!
怎么不行了
socketClient.registerSocketDelegate(new SocketClient.SocketDelegate() {
@OverRide
public void onConnected(SocketClient client) {
LogUtil.e("SOCKET onConnected!!!!!!!" + client.getState());
//socket 断开自动重新登录
if(skDisconnect){
NetRequest.login();
skDisconnect = false;
}
}
@Override
public void onDisconnected(SocketClient client) {
skDisconnect = true;
LogUtil.e("SOCKET Disconnected!!!!!!! count = "+count);
if(count < 15){
count++;
serviceRun();
}
}
@Override
public void onResponse(SocketClient client, @NonNull SocketResponsePacket responsePacket) {
// byte[] data = responsePacket.getData(); // 获取byte[]数据
String msg = responsePacket.getMessage(); // 使用默认编码获取String消息
LogUtil.e("onResponse MSG = "+msg);
if(!preMsg.equals(msg)){
preMsg = msg;
intent.putExtra("data", msg);
sendBroadcast(intent);
}
}
});
请求超时后没有回调吗?
比如数据发送时,对发送超时的判读和处理怎样做了?
我尝试了以下 2.0.3 2.0.0 1.5.0 都不能成功依赖 是什么情况啊 是服务器的问题吗?
定义的是按长度自动接收,然后有一包的长度大概在10W左右,接收到数据的时候会延迟1-2S,现在用你要处理的数据要比较的即使,不知道能不能有办法解决
我在onConnected的回调里设置了 socketClient.getSocketPacketHelper().setReadStrategy(SocketPacketHelper.ReadStrategy.Manually);
socketClient.readDataToLength(CharsetUtil.stringToData("Server accepted", CharsetUtil.UTF_8).length);
只有在服务器第一次发送消息是能收到,但是信息不完整. 而后面服务器再发新消息(IOS设备能收到),我这里就收不到了,onResponse没响应。
我有用心跳包保持长连接,客户端发送信息到服务器没有出现问题。现在就是接收服务器信息出现问题,服务器发送的信息没有包头和包尾只有正文。求助
可以用于Socket通讯吗?现在不知道服务端的怎么写的,但是只是知道是Socket通讯,不知道可不可以用这个框架
FATAL EXCEPTION: Thread-22025
Process: com.zcyke.test, PID: 24508
java.lang.IllegalArgumentException: we need string charset to send string type message at com.vilyever.socketclient.SocketClient$SendThread.run(SocketClient.java:1090)
👍
另外,刚看了一个博客,说到:
当实例化一个类时有很多可选参数的时候,我们或许会写很多不同参数的构造方法,可读性会非常差,并且客户端也不知道在什么时候用什么构造器,这是非常非常糟糕的,同样静态方工厂也不能避免,这个时候我们需要用到构建器,也即设计模式里的Builder模式
我注意到你最新的1.3.3里面的 SocketPacket 类有很多构造方法,并且也遇到可读性差问题,是否可以考虑下 Builder 设计模式。
💯
在SocketClient的__i__onReceiveResponse代码中,请求的responsepacket会发给所有SocketClientDelegate,问题是SocketClientDelegate里面就得判断是不是它的resp,还要维护SocketClientDelegate的生命周期
private void __i__onReceiveResponse(@NonNull final SocketResponsePacket responsePacket) {
......
if (getSocketClientDelegates().size() > 0) {
ArrayList<SocketClientDelegate> delegatesCopy =
(ArrayList<SocketClientDelegate>) getSocketClientDelegates().clone();
int count = delegatesCopy.size();
for (int i = 0; i < count; ++i) {
delegatesCopy.get(i).onResponse(this, responsePacket);
}
}
}
这个
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.