Java 中 TCP字节流是转换成字符流的。

比如说一个字符串

伪代码
// Client客户端:
String str = “字节流转字符流“;
byte[] buff = str.getBytes("UTF-8")

// Server服务端
InputStreamReader reader = new InputStreamReader(inputStream,"UTF-8")
char[] char = new char[1024];
reader.read(char,,);

客户端UTF-8编码字符串的字节流发送给服务端,期间可能一个字符对应的字节被拆分成多个包发送了(因为TCP时候面向字节的,一个UTF-8字符对应多个字节)。

  1. 这种情况的话,服务端是如何保证正确解析字节到字符的?
  2. 还有UTF-8编码英文数字为一个字节,中文为多个字节,那么来了一个字节它又是怎么确定这个字节是英文数字,还是一个中文编码的一部分呐(字符编码是不是类似于哈夫曼树一样那呐?)

希望能够解惑,十分感激。推荐博客也可以。

阅读 4.7k
2 个回答

下面给出我个人的理解哈,大家切磋下

  1. 一般来说发送数据的时候都会使用某种协议的,比如google的protobuf,协议规定会有起止标志(能够让服务端解析出数据包)。如果服务器发现接收的数据还没结束,就继续等待,接收下一个数据包
  2. 可以看下UTF8的编码方式,大概意思就是能够根据最高几位bit的值确定『一个字节它又是怎么确定这个字节是英文数字,还是一个中文编码的一部分呐』

utf8编码介绍:https://baike.baidu.com/item/...

TCP拆包粘包现象,这个在TCP数据传输过程中,肯定会存在的。

TCP协议是面向数据流的,能保证数据的正确性。
也就是说源源不断的流到了接收端之后,组装在一起,数据能保证是正确。

因此,解决拆包粘包在于发送端接收端定义数据边界,比如:

  1. 固定头部,头部中包含数据完整性的信息,数据长度等。
  2. 消息边界,比如以0xFF作为边界值等。

这些也就是协议发送端接收端根据协议对数据进行编解码,这样就可以确定每个字节代表的意义。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题