做socket通信已经好多次,但是每次都是感觉缺点什么。今天有了点新认识,做下记录,如果认识有误,请大家指正。
首先,本文讨论的前提是基于tcp的通信,并且是基于java流,socket是阻塞方式读取发送。
对于socket通信,其有一个缓冲区,大概是8kb,当然也可以设置缓冲区大小。如何操作大家可以查阅相关资料api。
如果我们发送一个很大的数据,那么一般会通过while等循环操作,调用比如write函数把数据通过流发送过去,通过write函数已发送的大小判断,来确定是否已经把所有数据发送完毕或者继续发送剩下的数据。类似于下面的伪代码:
int sentBytesCount ;//将要发送的数据字节数
byte buffArr[sentBytesCount];// 将要发送的数据
while(true) {
write(buffArr, offset, len)
然后 根据sentBytesCount,对 offset 和len数值更新继续发送或者退出
}
而对于接受数据,通过输入流的read函数,并结合返回值来确定实际接收的数据量
int read(byte[] buffer)
根据应用协议,合理设计要读取的数据大小byteCount(例如2个应用协议包大小),然后根据这些数据,结合应用协议判断是否是有效的数据包,对数据包根据应用协议进行
分包(得到这2个应用数据)
byte rawbuffer[FRAME_LEN];//FRAME_LEN 表示一个应用数据包的字节数while ( ( readBytes = istream.read( rawbuffer ) ) != -1 ) {//我们前提假设是阻塞模式 对rawbuffer数据进行解析 } 这里提一下返回值-1,-1表示流结束,对于文件流来说 就是对到了文件尾,但是socket的输入流就表示流断开了,所以不能把-1当做发送数据已经完全接收结束的判断依据。 ok,就写这么多吧,自己也感觉写的好像缺点什么,等有时间再补充吧。如果有什么错误,或者你有更好的认识,请不吝赐教。