“全双工“是什么

“全双工”这个词语,我第一次看到的时候,感觉不明觉厉;第二次看到的时候,还是摸不到头脑……

我是在"NIO"这里接触到的“全双工”。

简单记录一下吧。

NIO 主要包括以下三个核心组件:

  • Buffer(缓冲区):NIO 读写数据都是通过缓冲区进行操作的。读操作的时候将 Channel 中的数据填充到 Buffer 中,而写操作时将 Buffer 中的数据写入到 Channel 中。
  • Channel(通道):Channel 是一个双向的、可读可写的数据传输通道,NIO 通过 Channel 来实现数据的输入输出。通道是一个抽象的概念,它可以代表文件、套接字或者其他数据源之间的连接。
  • Selector(选择器):允许一个线程处理多个 Channel,基于事件驱动的 I/O 多路复用模型。所有的 Channel 都可以注册到 Selector 上,由 Selector 来分配线程来处理事件

Channel 是全双工的。在 UNIX 网络编程模型中,底层操作系统的通道都是全双工的,同时支持读写操作。所以Channel 可以比流更好地映射底层操作系统的 API。

全双工是通讯传输的一个术语。通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时(瞬时)进行信号的双向传输(A→B且B→A)。指A→B的同时B→A,是瞬时同步的。

单工的话,一个时间点只能A->B 或者 B->A。现在打电话就是全双工的,多方可以同时喊话聊天。

全双工(**Full Duplex**)是一种通信方式,允许数据在两个方向上 **同时传输**,即通信双方可以 **同时发送和接收数据**。它与半双工(Half Duplex)和单工(Simplex)是三种常见的通信模式。 --- ## ✅ 全双工的定义 > **全双工通信是指两个通信设备之间可以在同一时间互发数据,彼此独立,互不干扰。** 这就像两个人面对面交谈,可以同时说话和听对方讲话(虽然现实中不太常见,但在技术中是可行的)。 --- ## ✅ 通信模式对比 | 模式 | 是否支持双向通信 | 是否可同时收发 | 示例 | |------------|------------------|----------------|------| | 单工(Simplex) | ❌ 只能一个方向 | ❌ 不行 | 键盘输入、广播电台 | | 半双工(Half Duplex) | ✅ 是 | ❌ 同一时刻只能一方发送 | 对讲机 | | 全双工(Full Duplex) | ✅ 是 | ✅ 是 | 网络通信(如 TCP)、电话通话 | --- ## ✅ 全双工在网络通信中的应用 ### 在 Java 中,Socket 编程可以实现全双工通信: ```java import java.io.*; import java.net.*; // Server Side public class FullDuplexServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(12345); System.out.println("Server is listening on port 12345..."); Socket socket = serverSocket.accept(); System.out.println("Client connected."); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 读取客户端消息的线程 Thread readThread = new Thread(() -> { try { String message; while ((message = in.readLine()) != null) { System.out.println("Client: " + message); } } catch (IOException e) { e.printStackTrace(); } }); // 发送消息给客户端的线程 Thread writeThread = new Thread(() -> { try { BufferedReader consoleInput = new BufferedReader(new InputStreamReader(System.in)); String userInput; while ((userInput = consoleInput.readLine()) != null) { out.println(userInput); } } catch (IOException e) { e.printStackTrace(); } }); readThread.start(); writeThread.start(); } } ``` ```java // Client Side public class FullDuplexClient { public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost", 12345); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 接收服务器消息 Thread readThread = new Thread(() -> { try { String message; while ((message = in.readLine()) != null) { System.out.println("Server: " + message); } } catch (IOException e) { e.printStackTrace(); } }); // 发送消息给服务器 Thread writeThread = new Thread(() -> { try { BufferedReader consoleInput = new BufferedReader(new InputStreamReader(System.in)); String userInput; while ((userInput = consoleInput.readLine()) != null) { out.println(userInput); } } catch (IOException e) { e.printStackTrace(); } }); readThread.start(); writeThread.start(); } } ``` --- ## ✅ 全双工的优点 | 优点 | 描述 | |------|------| | 高效通信 | 数据可以同时发送和接收,提高吞吐量 | | 实时性强 | 更适合实时交互系统,如视频会议、在线游戏 | | 延迟低 | 因为不需要等待,响应更快 | --- ## ✅ 全双工 vs 半双工(举例) - **对讲机(半双工)**:每次只能一个人讲话,另一个人必须等。 - **电话(全双工)**:两人可以同时说话并听到对方声音。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值