关于socket通信的一点认识

做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,就写这么多吧,自己也感觉写的好像缺点什么,等有时间再补充吧。如果有什么错误,或者你有更好的认识,请不吝赐教。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值