根本就收不了消息,回调不了?demo也是一样,到底该怎么配置啊
希望好心人回答下
设置策略模式,看源码好像自定义策略模式给return了,没有走到onResponse
if (self.getSocketConfigure().getSocketPacketHelper().getReadStrategy() == SocketPacketHelper.ReadStrategy.Manually) { return; } 如果是Manually 的话不回调 直接返回了
- 使用{@link com.vilyever.socketclient.helper.SocketPacketHelper.ReadStrategy.AutoReadToTrailer}必须设置此项
- 用于分隔多条消息
如果设置了ReadStrategy.Manually 在哪里处理回调呢?
/** * 设置读取策略为手动读取 * 手动读取有两种方法 * 1. {@link SocketClient#readDataToData(byte[], boolean)} )} 读取到与指定字节相同的字节序列后回调数据包 * 2. {@link SocketClient#readDataToLength(int)} 读取指定长度的字节后回调数据包 * * 此时SocketPacketHelper中其他读取相关设置将会无效化 */ socketClient.getSocketPacketHelper().setReadStrategy(SocketPacketHelper.ReadStrategy.Manually);
作者上面说了呀
源码写死了吧,没有回调,需要自己手动调用 readDataXXX 需要回掉的话 改源码呗,自己添加一个回掉好了
我也是,连接成功了,但收不到消息
//设置读取策略为 AutoReadToTrailer,然后设置结尾符 socketClient.getSocketPacketHelper().setReadStrategy(SocketPacketHelper.ReadStrategy.AutoReadToTrailer); socketClient.getSocketPacketHelper().setReceiveTrailerData("\r\n".getBytes(Charset.defaultCharset())); 服务器端发送消息的时候,在文本结尾加上 \r\n eg: abcd\r\n
以上是我的设置,这样可以接收到消息
解决收不到消息的问题,自己修改一下源码SocketPacketHelper.ReadStrategy.Manually模式下添加回调:
// if (self.getSocketConfigure().getSocketPacketHelper().getReadStrategy() == SocketPacketHelper.ReadStrategy.Manually) {
// return;
// }
//注释掉
try {
while (self.isConnected()
&& self.getSocketInputReader() != null
&& !Thread.interrupted()) {
Log.d(TAG, "Receiving...");
...
循环里面添加一个else if:
else if (self.getSocketConfigure().getSocketPacketHelper().getReadStrategy() == SocketPacketHelper.ReadStrategy.Manually) {
try {
byte[] data = self.getSocketInputReader().readToLengthNoLimit(packetLengthDataLength);
self.setLastReceiveMessageTime(System.currentTimeMillis());
packet.setData(data);
self.getReceivingResponsePacket().setData(data);
if (self.getSocketConfigure().getCharsetName() != null) {
self.getReceivingResponsePacket().buildStringWithCharsetName(self.getSocketConfigure().getCharsetName());
}
} catch (Exception e) {
e.printStackTrace();
if (self.getReceivingResponsePacket() != null) {
self.__i__onReceivePacketCancel(packet);
self.setReceivingResponsePacket(null);
}
}
}
只要发现有数据就调用回调,这里判断大于0,缓存空间大小自己定义,太小会出现丢失数据的问题;
public byte[] readToLengthNoLimit(int length) throws IOException {
if (length <= 0) {
return null;
}
synchronized (lock) {
if (!__i__isOpen()) {
throw new IOException("InputStreamReader is closed");
}
try {
byte[] buffer = new byte[length];
int readCount = 0;
do {
readCount = this.inputStream.read(buffer);
if (readCount > 0) {
return Arrays.copyOf(buffer, readCount);
//String string = CharsetUtil.dataToString(copyOf, CharsetUtil.UTF_8);
}
} while (readCount != -1);
//return buffer;
} catch (IOException e) {
e.printStackTrace();
return null;
}
return null;
}
}
设置模式和缓存空间大小
private void iSetupReadManuallyForReceiver(SocketClient socketClient) {
/*
* 设置读取策略为手动读取
* 手动读取有两种方法
* 1. {@link com.vilyever.socketclient.SocketClient#readDataToData(byte[], boolean)} )} 读取到与指定字节相同的字节序列后回调数据包
* 2. {@link com.vilyever.socketclient.SocketClient#readDataToLength(int)} 读取指定长度的字节后回调数据包
*
* 此时SocketPacketHelper中其他读取相关设置将会无效化
*/
socketClient.getSocketPacketHelper().setReceivePacketLengthDataLength(10240);
socketClient.getSocketPacketHelper().setReadStrategy(SocketPacketHelper.ReadStrategy.Manually);
}