【在线等.....】有没有好心人帮我看一段代码啊,我看不太懂......

dabing69221 2013-12-14 03:30:54
最近重新复习了一遍Socket,才知道以前压根就没有深入的学习。现在遇到了一个问题有点疑惑,想请大家帮我分析分析:

在Java Socket中有TCP与UDP套接字之分,UDP套接字中保留了消息边界,所以接收信息非常方便;但是TCP却没有保留消息边界,需要自己解决消息边界问题;

现在我知道:在TCP套接字中处理消息边界有两种办法:1.使用定界符 2.使用显示长度,使用定界符来处理消息边界还好理解,但是,使用“显示长度”来解决消息边界问题时,却有点看不明白,下面是我参考《TCP/IP Socket》书中的代码,到现在一直看不明白,有没有大神帮我看看下边这段代码是什么意思啊,谢谢!!

使用“显示长度”解决消息边界问题的代码如下:

**
* TCP套接字使用“显示长度”的方式处理消息边界
*
* @author dabing
*
*/
public class LengthFramer {

public static final int MAXMESSAGELENGTH = 65535;

public static final int BYTEMASK = 0xff;

public static final int SHORTMASK = 0xffff;

public static final int BYTESHIFT = 8;

private DataInputStream in;

public LengthFramer(InputStream in) {
this.in = new DataInputStream(in);
}

public void sendMsg(byte[] message, OutputStream out) throws IOException {
if (message.length > BYTESHIFT) {
throw new IOException("message too long");
}

out.write((message.length >> BYTEMASK) & BYTEMASK);
out.write(message.length & BYTEMASK);
out.write(message);
out.flush();
}

public byte[] receiveMsg() throws IOException {
int length;
try {
length = in.readUnsignedShort();
} catch (EOFException e) {
return null;
}

byte[] msg = new byte[length];
in.readFully(msg);
return msg;
}
}



在线等,,,, 有没有好心人啊......
...全文
246 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
poooll 2013-12-14
  • 打赏
  • 举报
回复
就是约定多少位存长度数据。比如约定4个字节,那么len转string之后不足4个字节就在前面补0就好了。 LZ代码中的位移应该是 message.length >> BYTESHIFT
dabing69221 2013-12-14
  • 打赏
  • 举报
回复
引用 3 楼 u012852259 的回复:
        out.write((message.length >> BYTEMASK) & BYTEMASK);         out.write(message.length & BYTEMASK);          这里肯定弄错了,都没BYTESHIFT,这个意思是输出长度。其实不用这么复杂。直接 out.write(message.length)就ok了。
这里是使用了移位运算
54蓝色芥末 2013-12-14
  • 打赏
  • 举报
回复
完全不懂帮顶,!!
dabing69221 2013-12-14
  • 打赏
  • 举报
回复
不是吧
poooll 2013-12-14
  • 打赏
  • 举报
回复
        out.write((message.length >> BYTEMASK) & BYTEMASK);         out.write(message.length & BYTEMASK);          这里肯定弄错了,都没BYTESHIFT,这个意思是输出长度。其实不用这么复杂。直接 out.write(message.length)就ok了。
dabing69221 2013-12-14
  • 打赏
  • 举报
回复
没有大神知道吗?
UDown 2013-12-14
  • 打赏
  • 举报
回复
不解,幚顶

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧