socket 通信
java 作客户端( java.net.Socket ), c++为服务端( libevent )
普通的单包发送和接收都没有问题..
但是当 java 发一个包过去, c++回复多个包的时候,,
java 端只接收到了第一个包。。。服务端显示所有的包都正常发送,但是 java 端没收到。
java 端的接收线程代码:
InputStream is = mSocket.getInputStream();
while(true){
byte[] buffer = new byte[10240]; is.read(buffer); ... ...
}
各位大大,能不能给点思路
![]() | 1 binbinyouliiii 2016-09-09 10:24:00 +08:00 socket 我都快忘了,我记得我以前写的好像是阻塞,然后新开线程 |
![]() | 2 Presageee 2016-09-09 10:29:52 +08:00 有定义协议吗,一个包一个包的读,每次读定长包头,解析包体长度读包体。一次性 read(buffer)肯定不行的 |
3 loqixh 2016-09-09 10:37:17 +08:00 ![]() 粘包了,先学习 socket 原理 |
![]() | 4 phttc OP @Presageee 对的,就是自定义协议的。。协议里会写当前是第几个包,一共有几个包。。。一次 read 就读出一条协议嘛,,读第二条的时候就阻塞在 read 里了,说明输入流已经是空的了。。 |
![]() | 5 phttc OP @loqixh 不好意思,我没说清楚。。我的包指的是我自己在代码里实现的分包,自定义协议里会写当前是第几个包,一共有几个包。。。不是底层的 TCP 包。。 |
![]() | 7 ovear 2016-09-09 11:09:29 +08:00 via Android flush 了么 |
![]() | 8 gamexg 2016-09-09 11:16:47 +08:00 byte[] buffer = new byte[10240]; is.read(buffer); 先把 buffer 打出来,应该还是拆包部分没做好。 |
![]() | 9 skydiver 2016-09-09 11:22:05 +08:00 via Android ![]() TCP 是流协议,没有包的概念… x3 需要的话要自己分包 |
10 hustfox 2016-09-09 11:29:40 +08:00 一般都是在包里加长度字段,根据长度字段来收数据的。因为如果 socket 包过长的话会自动拆分成多个包的。 |
![]() | 12 wwqgtxx 2016-09-09 11:40:27 +08:00 阻塞在 read 中应该是填不满你的 10240 这么大的缓冲区,而不是没有数据 |
![]() | 13 anexplore 2016-09-09 11:46:48 +08:00 c++端数据都 flush 出来了嘛 或者你试一下 c++端发完包就 close socket |
![]() | 14 crazyxin1988 2016-09-09 11:52:50 +08:00 ![]() is.read(buffer); 这样读取方式不对。一般这样读数据: while((len = is.read(buffer)) != -1){ } |
![]() | 15 phttc OP |
![]() | 17 21grams 2016-09-09 13:19:37 +08:00 ![]() 建议用 wireshark 抓一下包, server 端和 client 端都要抓,首先要保证在 tcp 层上所有的数据确实是发出来了。 |