IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Channel 通道 -> 正文阅读

[网络协议]Channel 通道

Channel (通道) 介绍

  • 通常来说 NIO 中的所有 IO 都是从 Channel 开始的
    • 从通道进行数据读取: 创建一个缓冲区, 然后请求通道读取数据
    • 从通道进行数据写入: 创建一个缓冲区, 写入数据, 并要求通道写入数据

Channel 和 Stream 的区别

  • Channel 可以读也可以写; Stream 一般是单向的, 只能读或写(所以之前用 Stream 进行 IO 操作的时候需要分别创建一个输入流和一个输出流)
  • Channel 可以异步读写
  • Channel 总是基于 Buffer (缓冲区)来读写

Channel 的几个重要实现

  • FileChannel : 用于文件的数据读写
  • DatagramChannel : 用于 UDP 的数据读写
  • SocketChannel : 用于 TCP 的数据读写, 一般是客户端实现
  • ServerSocketChannel : 允许监听 TCP 连接请求, 每个请求会创建一个 SocketChannel, 一般是服务端实现

FileChannel 的使用

	public static void main(String[] args) throws IOException {
        //默认 向buffer里写
        ByteBuffer buffer1 = ByteBuffer.allocate(100);
        //创建 FileChannel
        FileChannel inChannel = new FileInputStream("data.txt").getChannel();
        //Buffer 从 Channel 读数据
        inChannel.read(buffer1);
        //使用完成后必须关闭 FileChannel
        inChannel.close();
        //转换成 从buffer里读
        buffer1.flip();
        System.out.println("\n--------------------读 Buffer-----------------------");
        while (buffer1.hasRemaining()) {
            System.out.print((char) buffer1.get());
        }
        //转换成 向buffer里写
        buffer1.clear();
        //调用 put() 方法手动向 Buffer 中写数据
        buffer1.put("woxihuannijinfaxiaojiejiewohaoxihuanni".getBytes());
        //创建 FileChannel
        FileChannel outChannel = new FileOutputStream("data.txt",true).getChannel();
        //转换成 从buffer里读
        buffer1.flip();
        //Buffer 向 Channel 写数据
        outChannel.write(buffer1);
        //使用完成后必须关闭 FileChannel
        outChannel.close();
    }

  • 开启 FileChannel
    • 需要通过 InputStream, OutputStream 或 RandomAccessFile 获取 FileChannel
  • 从 FileChannel 读取数据 / 向 FileChannel 写入数据
    • 需要创建一个 Buffer 对象
  • 关闭 FileChannel

SocketChannel 和 ServerSocketChannel 的使用

  • SocketChannel 创建基于 tcp 协议的客户端对象, 因为 SocketChannel 中不存在 accept() 方法, 所以它不能成为一个服务端程序
  • SocketChannel 对象通过 connect() 方法可以连接到其他 tcp 服务器程序
public class WebClient {
    public static void main(String[] args) throws IOException {
        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.connect(new InetSocketAddress("127.0.0.1",19999));

        final ByteBuffer writeBuffer = ByteBuffer.allocate(128);
        writeBuffer.put("hello, i am client".getBytes());
        writeBuffer.flip();
        socketChannel.write(writeBuffer);

        final ByteBuffer readBuffer = ByteBuffer.allocate(128);
        socketChannel.read(readBuffer);
        readBuffer.flip();
        while (readBuffer.hasRemaining()){
            System.out.print((char)readBuffer.get());
        }
        socketChannel.close();
    }
}
  • ServerSocketChannel 允许监听 tcp 连接请求
  • 通过 ServerSocketChannelImpl 的 accept() 方法, 可以创建一个 SocketChannel 对象, 从客户端读/写数据
public class WebServer {
    public static void main(String[] args) throws IOException {
        final ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.socket().bind(new InetSocketAddress("127.0.0.1", 19999));
        final SocketChannel socketChannel = serverSocketChannel.accept();
        final ByteBuffer writeBuffer = ByteBuffer.allocate(128);
        writeBuffer.put("hello, i am server".getBytes()).flip();
        socketChannel.write(writeBuffer);
        final ByteBuffer readBuffer = ByteBuffer.allocate(128);
        socketChannel.read(readBuffer);
        readBuffer.flip();
        while (readBuffer.hasRemaining()) {
            System.out.print((char) readBuffer.get());
        }
        socketChannel.close();
        serverSocketChannel.close();
    }
}

客户端

  • 通过SocketChannel连接到远程服务器
  • 创建读数据/写数据缓冲区对象来读取服务端数据或向服务端发送数据
  • 关闭SocketChannel

服务端

  • 通过ServerSocketChannel 绑定ip地址和端口号
  • 通过ServerSocketChannelImpl的accept()方法创建一个SocketChannel对象用户从客户端读/写数据
  • 创建读数据/写数据缓冲区对象来读取客户端数据或向客户端发送数据
  • 关闭SocketChannel和ServerSocketChannel
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-02 11:45:12  更:2021-09-02 11:46:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:36:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码