用socket获取传输数据长度(in.available())总是为8912的问题

这两天把用socket发送定长报文通讯改成分页请求后,就去调试了,由于数据量大,部署上去我接收到的数据最会打印长度都是8912,然后就用我自带的笔记本通过socket发同样一模一样的数据后发现没问题,然后我们调试双方就各种考虑问题,他们怀疑我的代码最大只能接收8912的byte限制,我就说哪不对啊,我自己测多大都能收过来,就部署到你这里,你们给我发多少数据就接收都少数据,他们又说我这边可能由于网络,因为毕竟是跨网段的,可能会有延迟,而我没有加延迟导致数据接收的少,说着他就开始这样演示说他那边加了延迟就不会这样了,我发现是这样啊,然后就回公司研究去了。

回到公司加了延迟发现还是不行,后来定位到原来是in.available()问题,可能是环境,也可能是网络,他那边就是全部发过来,我最大就是8912的长度,8912的长度开辟空间,接收也就只能是8912了,所以数据解析失败,然后解决的办法是,用in.read()读取头部5位,这个头部5位是我们自己定义的报文长度,然后获取长度是23900,我就用这个个得到的真实的又不数据,然后根据这个长度开辟空间,这样所有的数据就都能接收到了。

改之前

改之后

就可以了

            int lengthHeader = 5;
            byte[] lengthByte = new byte[lengthHeader];
            in.read(lengthByte);
            String lengthStr = new String(lengthByte);
            int lengthI = Integer.parseInt(lengthStr);

            // 根据长度开辟空间
            System.out.println("byte[]接收开辟的空间:" + lengthI);
            byte[] receiveFirst = new byte[lengthI];
            int readCountFirst = 0; // 已经成功读取的字节的个数
            while (readCountFirst < lengthI) {
                readCountFirst += in.read(receiveFirst, readCountFirst, lengthI - readCountFirst);
            }
            if (receiveFirst.length == 0) {
                System.out.println("没有接收到数据!");
                return null;
            }
            String strData = new String(receiveFirst);
            String pjStr = lengthStr + strData;
            //System.out.println("接收的数据:" + strData);
            return pjStr;

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值