我设计的一个双端通信程序,用socket传输数据.发送端发送命令后接收端接受到命令,然后根据命令发送发送端所请求的数据.请求的数据大小比较难确定,一般每次在0到50k之间.
我都是发送端send了之后马上就调用receive接收,send和receive只膈几行无关紧要的几乎不影响时间的代码.我怕时间差太短接收端反映没那么快,导致发送端接收不到要求的数据或者接收的数据不完整.这该怎么办?我不想用sleep因为网速经常变的,用sleep会影响效率.而且怎么确保数据已经传输完毕?
我接收数据用的字节数组只有1024个单位,会不会出现接收不完整现象?这该如何解决?我不想用50k的数组因为好浪费.
如果对方发来2k数据,我只用1k的数组接收,剩余的1k会不会滞留?下一次调用receive会不会接收到这1k的数据?
我都是发送端send了之后马上就调用receive接收,send和receive只膈几行无关紧要的几乎不影响时间的代码.我怕时间差太短接收端反映没那么快,导致发送端接收不到要求的数据或者接收的数据不完整.这该怎么办?我不想用sleep因为网速经常变的,用sleep会影响效率.而且怎么确保数据已经传输完毕?
我接收数据用的字节数组只有1024个单位,会不会出现接收不完整现象?这该如何解决?我不想用50k的数组因为好浪费.
如果对方发来2k数据,我只用1k的数组接收,剩余的1k会不会滞留?下一次调用receive会不会接收到这1k的数据?
如何避免发送和接收之间的时间差?就是说我发个信号给你叫你发数据给我,我如何知道对方已经发送数据完毕了,然后再用receive?
发送消息的线程我最担心的代码大概是这样:
......
socket1.send(xx,xx.length,0);
byte[] message=socket1.receive();
......这样send完后下一句马上就receive会不会执行得太快了?会不会对方还没有发数据过来这句receive就执行结束然后返回空值?会不会对方才发了一半的数据receive这句就执行过去了然后message里面只有这一半数据的信息?我这样搞算不算异步编程?上面的问题然后解决?
socket1.send(xx,xx.length,0);
byte[] message=new byte[1024];
socket1.receive(message);
如果要保证得到的包总是完成呢,那最好自己做控制
不要担心代码跑得太快,Receive在没有接收到数据的情况下会被阻塞,直接接收到数据。至于数据大小,你应当一直接收数据,直到连接被关闭。因为Receive只会接收缓冲区大小的数据,剩下的数据会被保存在系统缓存中,等待下一次接收。