免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1740 | 回复: 4
打印 上一主题 下一主题

紧急:socket读不了server端一次发过来的80k数据包? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-22 22:10 |只看该作者 |倒序浏览
先向各位大师说说基本状况(java):
1:异步通讯,一个socket,一个线程对它进行发,一个线程对它进行收,发送的包和收到的包通过一个msgid来关联。
2:和服务器建立长连接;
3:收,发的包的前四个字节是一个int,用于说明此次传输的总长度,先readint,然后在根据长度说明去循环读服务器发过来的东东。收数据的代码如下:
byte[] receivedData;
                int dataSize;
                dataSize = in.readInt();
               
                // 注意:recievedata 不包含消息包长度这四个字节
                logger.info("len from server:" + dataSize);
                receivedData = new byte[dataSize - 4];
                int dataTotalSizeToRead = dataSize - 4;
                int dataToReadLeft = dataSize - 4;
                int dataThisTimeRead;
                while (dataToReadLeft > 0) {
                        // 一直读到指定数目的字节为止
                        dataThisTimeRead = in.read(receivedData, dataTotalSizeToRead
                                        - dataToReadLeft, dataToReadLeft);
                        dataToReadLeft -= dataThisTimeRead;
                    ..........}

大多数情况下,收发的数据都是1k左右,在这种情况下一切正常。偶尔,会有长达10k的包发过来,这时候问题来了:..........
比如服务器发一个85000bytes的包过来(我读到它的包长度说明。),然后我进入while循环,每次都把读到的长度(dataThisTimeRead )打印出来:
2044
10220
2015
这样读了几次之后,每次只能读到219个byte(收这85000bytes的同时,另外一个线程会往服务器发activetest(心跳),而219正是服务器给我的心跳包返回的响应包之长度),累加的读的总长度还远远小于85000。似乎os把前面85000个byte中未读剩下的东东都丢掉了,而是在接收心跳包的响应了。持续几秒之后,服务器就把socket关闭了,导致我这边出错。

请问怎样防止os的tcp模块在流量太多的时候,把前面收到的内容自动丢弃!!似乎它为了将后面收到的小包(219bytes的心跳响应)放到接收缓冲区里面,而把前面收到的85000字节中我应用程序尚未读完的东东丢弃了。

我设置了socket的revievebuffer,但是没有起到任何作用!
谢谢各位帮助!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2006-05-22 22:47 |只看该作者
JAVA支持线程
但似乎JAVA不是线程安全的

用C编个可执行程序让JAVA通过命令行调用CGI或是用C++编译成JNI试试?

论坛徽章:
0
3 [报告]
发表于 2006-05-23 08:51 |只看该作者
为什么对方一次send80k的东东过来,我的socket就会出错。对方的write函数会报错!对方说是我这边不能接收导致的。
求救!

论坛徽章:
0
4 [报告]
发表于 2006-05-23 20:50 |只看该作者
等待

论坛徽章:
0
5 [报告]
发表于 2006-05-24 10:28 |只看该作者
TCP/IP有流量控制?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP