Skip to content

2026-01-30-网络嵌套字

网络嵌套字主要的内容有两个,分别是 UDPTCP

特点:

  • UDP: 无连接,不可靠传输,面向数据报,全双工
  • TCP: 有连接,可靠传输,面向字节流,全双工

概念

连接

传输层中的“连接”是一个抽象的概念,不是像光纤这样能看得见摸得着的

  • 有连接:通信双方会保存对方的连接数据,比如 IP, 端口
  • 无连接不会保存对方的连接数据

传输

传输分为可靠传输与不可靠传输

  • 可靠传输:发送数据后,会验证一下数据是否成功发送,如果没成功,那么就会采取一系列的自救措施
  • 不可靠传输只管发送数据,不管是否成功

Q: 可靠传输一定是比不可靠传输好吗?

A: ​答案显然是否定的,如果一定好,那么所有的都应该是“可靠传输”,而不是一个可靠,一个不可靠。 由于要验证数据,可靠传输会牺牲一定的效率,而不可靠传输是没有这个问题

传输单位

传输单位有数据报与字节流

  • 数据报以数据报为单位的,必须分装为数据报才能发送
  • 字节流以字节流为单位的,和文件中的字节流是一样的概念

双工

双工分为全双工与半双工

  • 全双工同一时刻同时可以接收与发送
  • 半双工同一时刻只能接收或发送

代码

UDP

UDP
UDP
  • 客户端
  • 服务端

问题:

  • 在返回构建数据报的时候,长度能不能把 result.getBytes().length 换为 result.length()

    显然不能,因为前者是字节流数组,后者是字符串。

    Java 中字符串是由一个一个字符组成的,而中文只能算一个字符,长度也只能算为一

    所以如果使用字符串中的长度,那么就会导致长度不匹配

TCP

TCP
TCP
  • 客户端
  • 服务端

问题:

  • 为什么使用 PrintWriter 中的 println 不会发送信息?

    由于IO操作是一个效率很低的操作,所以为了降低IO次数,开发者设计了缓冲区

    使用 println 只会把内容发送在缓冲区里面,只有当使用 flush 后,内容才会发送

  • 哪里会有“文件资源溢出”?如何解决?

    客户端是没有什么问题的,因为在文件需要释放的时候,客户端进程就已经结束了,会自动释放文件资源

    服务端在一次用户访问结束的时候,服务端的进程不能结束,但是用户访问的时候需要占据一定的文件资源, 为了防止一直占据资源而不释放的情况,所以需要手动释放文件资源

  • 如何解决“在同一时间只能处理一个客户端”的问题?

    出现这样的原因是因为只使用了单线程,单线程的串行执行的,所以同一时间只能处理一个客户端

    解决方法是使用多线程,这样就可以解决这个问题了

    多线程一般会使用到线程池,从而降低线程创建/销毁的开销

    由于客户端在多数情况下都是等待的,如果一个客户端一个线程就会导致这个线程在大多数的情况下都是等待的, 这样会造成大量的资源浪费问题,如果有十几万个客户端,服务器是会崩溃的,因为服务器是不能有十几万个线程的

    解决这样“高并发”的问题,通过多路复用来解决这样的情景