我设计的一个双端通信程序,用socket传输数据.发送端发送命令后接收端接受到命令,然后根据命令发送发送端所请求的数据.请求的数据大小比较难确定,一般每次在0到50k之间. 
我都是发送端send了之后马上就调用receive接收,send和receive只膈几行无关紧要的几乎不影响时间的代码.我怕时间差太短接收端反映没那么快,导致发送端接收不到要求的数据或者接收的数据不完整.这该怎么办?我不想用sleep因为网速经常变的,用sleep会影响效率.而且怎么确保数据已经传输完毕? 
我接收数据用的字节数组只有1024个单位,会不会出现接收不完整现象?这该如何解决?我不想用50k的数组因为好浪费. 
如果对方发来2k数据,我只用1k的数组接收,剩余的1k会不会滞留?下一次调用receive会不会接收到这1k的数据?

解决方案 »

  1.   

    单单加个报文长度,只是能验证对错,不能降低错误率.
    如何避免发送和接收之间的时间差?就是说我发个信号给你叫你发数据给我,我如何知道对方已经发送数据完毕了,然后再用receive?
      

  2.   

    我现在的做法是:主窗体中点击发送命令按钮后,新建一个线程,用这个线程发送命令和接收反馈的信息.然后把反馈的信息输出给主窗体.
    发送消息的线程我最担心的代码大概是这样:
    ......
    socket1.send(xx,xx.length,0);
    byte[] message=socket1.receive();
    ......这样send完后下一句马上就receive会不会执行得太快了?会不会对方还没有发数据过来这句receive就执行结束然后返回空值?会不会对方才发了一半的数据receive这句就执行过去了然后message里面只有这一半数据的信息?我这样搞算不算异步编程?上面的问题然后解决?
      

  3.   

    上面的错了,代码应该是:
    socket1.send(xx,xx.length,0);
    byte[] message=new byte[1024];
    socket1.receive(message);
      

  4.   

    不要默认socket会按照应用层的需求去分包
    如果要保证得到的包总是完成呢,那最好自己做控制
      

  5.   

    呵呵………………
    不要担心代码跑得太快,Receive在没有接收到数据的情况下会被阻塞,直接接收到数据。至于数据大小,你应当一直接收数据,直到连接被关闭。因为Receive只会接收缓冲区大小的数据,剩下的数据会被保存在系统缓存中,等待下一次接收。