• 请不要在回答技术问题时复制粘贴 AI 生成的内容
phttc
V2EX  ›  程序员

java socket 问题

  •  
  •   phttc · Sep 9, 2016 · 4671 views
    This topic created in 3712 days ago, the information mentioned may be changed or developed.

    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);
    
    ...
    
    ...
    

    }

    各位大大,能不能给点思路

    Supplement 1  ·  Sep 9, 2016
    举个栗子吧。。。

    客户端 C :( askid=1;current=1;total=1;)你是谁?
    服务端 S :( askid=1;current=1;total=3;)我
    S :( askid=1;current=2;total=3;)是
    S :( askid=1;current=3;total=3;)服务器


    服务端日志显示三个包都成功发送了。但是客户端的日志里就只有( current=1;total=3;)我 这么一条。
    18 replies  •  2016-09-09 13:50:20 +08:00
    binbinyouliiii
    binbinyouliiii
    Sep 9, 2016
    1
    socket 我都快忘了,我记得我以前写的好像是阻塞,然后新开线程
    Presageee
    Presageee
    Sep 9, 2016
    2
    有定义协议吗,一个包一个包的读,每次读定长包头,解析包体长度读包体。一次性 read(buffer)肯定不行的
    loqixh
    loqixh
    Sep 9, 2016❤️1
    3
    粘包了,先学习 socket 原理
    phttc
    phttc
    OP
    Sep 9, 2016
    4
    @Presageee 对的,就是自定义协议的。。协议里会写当前是第几个包,一共有几个包。。。一次 read 就读出一条协议嘛,,读第二条的时候就阻塞在 read 里了,说明输入流已经是空的了。。
    phttc
    phttc
    OP
    Sep 9, 2016
    5
    @loqixh 不好意思,我没说清楚。。我的包指的是我自己在代码里实现的分包,自定义协议里会写当前是第几个包,一共有几个包。。。不是底层的 TCP 包。。
    hcymk2
    hcymk2
    Sep 9, 2016
    6
    @phttc
    buffer 数组的长度?
    ovear
    ovear
    Sep 9, 2016 via Android
    7
    flush 了么
    gamexg
    gamexg
    Sep 9, 2016
    8
    byte[] buffer = new byte[10240];
    is.read(buffer);

    先把 buffer 打出来,应该还是拆包部分没做好。
    skydiver
    skydiver
    Sep 9, 2016 via Android❤️1
    9
    TCP 是流协议,没有包的概念… x3

    需要的话要自己分包
    hustfox
    hustfox
    Sep 9, 2016
    10
    一般都是在包里加长度字段,根据长度字段来收数据的。因为如果 socket 包过长的话会自动拆分成多个包的。
    loqixh
    loqixh
    Sep 9, 2016
    11
    @phttc 这样是不行的,要用长度分割,要不就和 http 一样用符号分割,因为 socket 会缓存
    wwqgtxx
    wwqgtxx
    Sep 9, 2016
    12
    阻塞在 read 中应该是填不满你的 10240 这么大的缓冲区,而不是没有数据
    eycfsjd
    eycfsjd
    Sep 9, 2016
    13
    c++端数据都 flush 出来了嘛 或者你试一下 c++端发完包就 close socket
    crazyxin1988
    crazyxin1988
    Sep 9, 2016❤️1
    14
    is.read(buffer); 这样读取方式不对。一般这样读数据:

    while((len = is.read(buffer)) != -1){

    }
    phttc
    phttc
    OP
    Sep 9, 2016
    15
    @wwqgtxx 跟缓冲区大小没关系的。。
    @skydiver @hustfox @loqixh

    举个栗子吧。。。

    客户端 C :( askid=1;current=1;total=1;)你是谁?
    服务端 S :( askid=1;current=1;total=3;)我
    S :( askid=1;current=2;total=3;)是
    S :( askid=1;current=3;total=3;)服务器


    服务端日志显示三个包都成功发送了。但是客户端的日志里就只有( current=1;total=3;)我 这么一条。
    eycfsjd
    eycfsjd
    Sep 9, 2016❤️1
    16
    @phttc 怎么判断的发送成功? 建议还是 抓包看一下
    21grams
    21grams
    Sep 9, 2016❤️1
    17
    建议用 wireshark 抓一下包, server 端和 client 端都要抓,首先要保证在 tcp 层上所有的数据确实是发出来了。
    phttc
    phttc
    OP
    Sep 9, 2016
    18
    @anexplore @21grams 谢谢,找到原因了。服务端说发送成功,其实并没有发出来。。。正在研究服务端到底是什么情况。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1586 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 08:06 · PVG 16:06 · LAX 00:06 · JFK 03:06
    ♥ Do have faith in what you're doing.