AndroidSocketClient icon indicating copy to clipboard operation
AndroidSocketClient copied to clipboard

根本就收不了消息,回调不了?demo也是一样,到底该怎么配置啊

Open bingely opened this issue 8 years ago • 7 comments

希望好心人回答下

bingely avatar Mar 15 '17 04:03 bingely

设置策略模式,看源码好像自定义策略模式给return了,没有走到onResponse

lmz1993 avatar Aug 11 '17 10:08 lmz1993

if (self.getSocketConfigure().getSocketPacketHelper().getReadStrategy() == SocketPacketHelper.ReadStrategy.Manually) { return; } 如果是Manually 的话不回调 直接返回了

  • 使用{@link com.vilyever.socketclient.helper.SocketPacketHelper.ReadStrategy.AutoReadToTrailer}必须设置此项
    • 用于分隔多条消息

tonightgarden avatar Aug 11 '17 10:08 tonightgarden

如果设置了ReadStrategy.Manually 在哪里处理回调呢?

lmz1993 avatar Aug 11 '17 11:08 lmz1993

/** * 设置读取策略为手动读取 * 手动读取有两种方法 * 1. {@link SocketClient#readDataToData(byte[], boolean)} )} 读取到与指定字节相同的字节序列后回调数据包 * 2. {@link SocketClient#readDataToLength(int)} 读取指定长度的字节后回调数据包 * * 此时SocketPacketHelper中其他读取相关设置将会无效化 */ socketClient.getSocketPacketHelper().setReadStrategy(SocketPacketHelper.ReadStrategy.Manually);

作者上面说了呀

源码写死了吧,没有回调,需要自己手动调用 readDataXXX 需要回掉的话 改源码呗,自己添加一个回掉好了

tonightgarden avatar Aug 11 '17 11:08 tonightgarden

我也是,连接成功了,但收不到消息

wenqian-cai-tuya avatar Mar 02 '18 09:03 wenqian-cai-tuya

//设置读取策略为 AutoReadToTrailer,然后设置结尾符 socketClient.getSocketPacketHelper().setReadStrategy(SocketPacketHelper.ReadStrategy.AutoReadToTrailer); socketClient.getSocketPacketHelper().setReceiveTrailerData("\r\n".getBytes(Charset.defaultCharset())); 服务器端发送消息的时候,在文本结尾加上 \r\n eg: abcd\r\n

以上是我的设置,这样可以接收到消息

lyongfly avatar Dec 08 '20 01:12 lyongfly

解决收不到消息的问题,自己修改一下源码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);
    }

androidneter avatar Aug 12 '22 08:08 androidneter