【Java】【NIO】【04】通过SocketChannel读写Socket

2023-11-16


	package easing.common.java.demo;
	
	import lombok.SneakyThrows;
	
	import java.net.InetSocketAddress;
	import java.nio.ByteBuffer;
	import java.nio.channels.*;
	import java.util.Iterator;
	import java.util.Set;
	
	@SuppressWarnings("all")
	public class Demo {
	
	    public static void main(String[] args) {
	        new Thread(Demo::startServer).start();
	        new Thread(Demo::startClient).start();
	    }
	
	    @SneakyThrows
	    protected static void startServer() {
	
	        //创建ServerSocketChannel
	        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
	        serverSocketChannel.socket().bind(new InetSocketAddress(5555));
	        serverSocketChannel.configureBlocking(false);
	
	        //注册Selector
	        Selector selector = Selector.open();
	        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
	
	        //Selector监听事件
	        while (true) {
	
	            int result = selector.select(2000L);
	
	            Set<SelectionKey> selectedKeys = selector.selectedKeys();
	            Iterator<SelectionKey> iterator = selectedKeys.iterator();
	            while (iterator.hasNext()) {
	                SelectionKey key = iterator.next();
	                //有客户端连接
	                if (key.isAcceptable()) {
	                    SocketChannel socketChannel = serverSocketChannel.accept();
	                    socketChannel.configureBlocking(false);
	                    socketChannel.register(selector, SelectionKey.OP_READ);
	                    System.out.println("Client Connected");
	                }
	                //有客户端可读
	                else if (key.isReadable()) {
	                    ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
	                    SocketChannel channel = (SocketChannel) key.channel();
	                    while (channel.read(byteBuffer) > 0) {
	                        byteBuffer.flip();
	                        System.out.println("Receive Data from Client: " + new String(byteBuffer.array(), 0, byteBuffer.remaining()));
	                        byteBuffer.clear();
	                    }
	                }
	                //移除已处理过的事件
	                iterator.remove();
	            }
	        }
	    }
	
	    @SneakyThrows
	    protected static void startClient() {
	
	        Thread.currentThread().sleep(2000L);
	
	        //创建ClientSocketChannel
	        SocketChannel socketChannel = SocketChannel.open();
	        socketChannel.configureBlocking(false);
	
	        //连接Server
	        InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", 5555);
	        socketChannel.connect(inetSocketAddress);
	        while (!socketChannel.finishConnect())
	            Thread.currentThread().sleep(100L);
	
	        //向服务端发送数据
	        for (int i = 0; i < 100; i++) {
	            Thread.currentThread().sleep(2000L);
	            ByteBuffer byteBuffer = ByteBuffer.wrap("connect".getBytes());
	            socketChannel.write(byteBuffer);
	        }
	
	        //关闭ClientSocketChannel
	        socketChannel.close();
	    }
	
	}



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java】【NIO】【04】通过SocketChannel读写Socket 的相关文章

随机推荐

  • Qt自学之路(二)-信号及槽机制

    1 信号与槽机制介绍 Qt提供信号与槽机制 用于类间通信 类似于观察者模式 信号相当于主题 槽相当于观察者 但是不同于观察者模式的地方为 1 槽可以连接多个信号 2 信号可以跨线程通知槽 队列连接 2 信号 1 信号通过emit命令进行发送
  • 计算机网络安全设计毕业设计,计算机网络安全及防护毕业设计论文01

    计算机网络安全及防护毕业设计论文01 16页 本资源提供全文预览 点击全文预览即可全文预览 如果喜欢文档就下载吧 查找使用更方便哦 14 9 积分 掩聋邀詹手免驱闷圭刽灶开谚楞涉弓陌村娠镍淖厕绍楔聚潍理娶咐穿哦砒铰飞议纹妇苛捂鲁绽舰赚蹄奴募
  • Acwing 291. 蒙德里安的梦想

    题目分析 摆放方块的时候 先放横着的 再放竖着的 总方案数等于只放横着的小方块的合法方案数 如何判断 当前方案数是否合法 所有剩余位置能否填充满竖着的小方块 可以按列来看 每一列内部所有连续的空着的小方块需要是偶数个 这是一道动态规划的题目
  • Win10 笔记本 解决屏幕忽明忽暗,自动降低亮度问题

    很多人虽然关闭了电源管理中的自动调整屏幕亮度 但还是没有解决 经过实践 发现是Intel显卡的软件上默认启用了 显示器节能技术 这个技术本意是上市为了增强电池的使用时间 但却牺牲了一部分用户体验 下面通过一些设置 来解决一部分笔记本 屏幕忽
  • day32 贪心

    122 买卖股票的最佳时机II 每天都有着卖出和不卖出两种状态 dp解决 55 跳跃游戏 贪心找到最大的覆盖范围 每次都看覆盖范围是否超过了总范围 超过即可 45 跳跃游戏II 贪心找到最大的覆盖范围 和 最小步数 package algo
  • 关于error: possibly undefined macro: AC_PROG_LIBTOOL问题解决

    通过baidu或者google 大多数解决方案都是通过安装libtool 不同的平台有不同的安装方式 比如ubuntu安装 sudo apt get install libtool 大多数情况下都能解决问题 但是通过安装libtool也不能
  • 关于list理论最大大小Integer.MAX_VALUE - 8

    今天看源码对list最大大小为什么是Integer MAX VALUE 8产生了兴趣 目前得出以下结论 首先数组头需要存储数组大小信息以及其它的一些信息 假设数组达到了最大则数组大小需要8个字节来存储 而当留下8个数组大小时则可保证至少有8
  • CMAKE之add_dependencies使用

    CMAKE之add dependencies使用 问题引入 问题解决 总结 问题引入 在项目中通常会遇见这样的情况 例如一个项目中有 main libhello a libworld a 当项目过小的时候 编译顺序是 a 然后是main 但
  • 也谈免拆机破解中兴B860av1.1(解决不能安装软件/解决遥控)

    20170221更新 部分用户 自己恢复出厂测试过 操作后仍然无法直接在当贝市场安装应用了 在第8条 最后两步 先改为中国通用市场 后面再改为未知局方 如果开机想优先启动当贝桌面 就把导出的0 ini里AutoStartIptv 1改为0
  • Ubuntu修改环境变量后命令不可用的解决办法

    方法一 导入临时变量 但是重启虚拟后会失效 export PATH PATH usr local sbin usr local bin sbin bin usr sbin usr bin 方法二 根本方法 普通用户 root用户都适用 解决
  • word打印

    package com stonewomb business outerContract contractApply utils import java io IOException import java text SimpleDateF
  • 【LeetCode】9月 每日一题

    LeetCode 9月 每日一题 9 1 题目 1475 商品折扣后的最终价格 思路 模拟即可 代码 function finalPrices prices number number let len number prices lengt
  • 设计模式(一)

    1 适配器模式 1 概述 适配器中有一个适配器包装类Adapter 其包装的对象为适配者Adaptee 适配器作用就是将客户端请求转化为调用适配者中的接口 当调用适配器中的方法时 适配器内部会调用适配者类的方法 这个调用对客户端是透明 实现
  • Python爬虫技术及其原理探

    导言 随着互联网的发展 大量的数据被存储在网络上 而我们需要从中获取有用的信息 Python作为一种功能强大且易于学习的编程语言 被广泛用于网络爬虫的开发 本文将详细介绍Python爬虫所需的技术及其原理 并提供相关的代码案例 1 HTTP
  • Tomcat日志配置远程rsyslog采集

    Tomcat日志数据的采集有很多种方式 使用tail是最简单的方法 但必须保证catalina out日志中的每行都是以日期格式开头的 除了tail方法外 还可以通过对rsyslog配置实现 本博客主要通过配置rsyslog进行Tomcat
  • 经验分享:解决 错误0x80071AC3:无法完成操作,请运行chkdsk并重试

    在Windows系统电脑下 使用移动硬盘或者U盘复制拷贝文件的时候 如果遇到一个这样的提示 一个意外错误使您无法移动该文件夹 如果您继续收到此错误 可以使用错误代码来搜索有关此问题的帮助 错误0x80071AC3 无法完成操作 因为卷有问题
  • Unity shader系列:内置Shader代码查看

    官网下载 https unity3d com cn get unity download archive 对自己使用的unity版本进行下图操作
  • centos7 将home的空间扩容到根目录

    Centos7把home目录下多余的空间转移到 根目录下 通过df h发现 根目录只有35G 而home目录可用的 居然有19G 我现在想分出8G给根目录 把你需要挂载的机器的逻辑卷记住 上面的图 左边是逻辑卷 右边是虚拟磁盘 dev ma
  • 图像处理-State of the Art

    https github com BlinkDL BlinkDL github io 目前常见图像任务的 State of the Art 方法 从 Super resolution 到 Captioning CV 二维图像任务 Image
  • 【Java】【NIO】【04】通过SocketChannel读写Socket

    package easing common java demo import lombok SneakyThrows import java net InetSocketAddress import java nio ByteBuffer