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

发布于 2022-09-12 01:36:35 字数 511 浏览 24 评论 0

比如说一个字符串

伪代码
// 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编码英文数字为一个字节,中文为多个字节,那么来了一个字节它又是怎么确定这个字节是英文数字,还是一个中文编码的一部分呐(字符编码是不是类似于哈夫曼树一样那呐?)

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

与之呼应 2022-09-19 01:36:35

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

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

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

还如梦归 2022-09-19 01:36:35

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

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文