4. 网络编程

简介: 4. 网络编程

4.1 非阻塞 vs 阻塞

阻塞

  • 阻塞模式下,相关方法都会导致线程暂停
  • ServerSocketChannel.accept 会在没有连接建立时让线程暂停
  • SocketChannel.read 会在没有数据可读时让线程暂停
  • 阻塞的表现其实就是线程暂停了,暂停期间不会占用 cpu,但线程相当于闲置
  • 单线程下,阻塞方法之间相互影响,几乎不能正常工作,需要多线程支持
  • 但多线程下,有新的问题,体现在以下方面
  • 32 位 jvm 一个线程 320k,64 位 jvm 一个线程 1024k,如果连接数过多,必然导致 OOM,并且线程太多,反而会因为频繁上下文切换导致性能降低
  • 可以采用线程池技术来减少线程数和线程上下文切换,但治标不治本,如果有很多连接建立,但长时间 inactive,会阻塞线程池中所有线程,因此不适合长连接,只适合短连接

服务器端

// 使用 nio 来理解阻塞模式, 单线程 // 0. ByteBuffer ByteBuffer buffer = ByteBuffer.allocate(16); // 1. 创建了服务器 ServerSocketChannel ssc = ServerSocketChannel.open();

// 2. 绑定监听端口 ssc.bind(new InetSocketAddress(8080));

// 3. 连接集合 List channels = new ArrayList<>(); while (true) { // 4. accept 建立与客户端连接, SocketChannel 用来与客户端之间通信 log.debug("connecting..."); SocketChannel sc = ssc.accept(); // 阻塞方法,线程停止运行 log.debug("connected... {}", sc); channels.add(sc); for (SocketChannel channel : channels) { // 5. 接收客户端发送的数据 log.debug("before read... {}", channel); channel.read(buffer); // 阻塞方法,线程停止运行 buffer.flip(); debugRead(buffer); buffer.clear(); log.debug("after read...{}", channel); } }

客户端

SocketChannel sc = SocketChannel.open(); sc.connect(new InetSocketAddress("localhost", 8080)); System.out.println("waiting...");



目录
相关文章
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
364 2
啥?Flutter也能整3D了吗?我靠,竟然是这样的操作👀
当我看了这样一个节目之后,我发现,复杂的ui竟然这么简单就可以实现了!当时我就用Flutter整了这么个3D效果,快来围观!!
|
Java 关系型数据库 MySQL
java入门019~springboot批量导入excel数据到mysql
java入门019~springboot批量导入excel数据到mysql
338 0
|
存储 开发框架 .NET
日志框架:聊聊记日志的最佳姿势
相信开发过大型系统的同学们都知道,日志在系统中有着举足轻重的位置,一方面,通过日志系统可以记录具体的业务流程以便完成业务追踪,另一方面,当系统出现异常时,通过日志可以快速的定位问题。在平时的开发中,相信大家都用过记录日志到文件以及使用老牌日志框架log4net等,特别是在网站开发过程中,很多都集成log4net来进行日志记录。那么在Netcore中有哪些日志记录的方式呢?从本节开始,我们就一块来看一下吧。
带你读《Elastic Stack 实战手册》之14:——3.4.1.7.阿里云Elasticsearch服务(4)
带你读《Elastic Stack 实战手册》之14:——3.4.1.7.阿里云Elasticsearch服务(4)
161 0
|
开发者 Python
Markdown 语法的使用 | 学习笔记
快速学习 Markdown 语法的使用
Markdown 语法的使用 | 学习笔记
|
图形学
unity之CanvasGroup解决文本异色问题
CanvasGroup解决文本异色问题
unity之CanvasGroup解决文本异色问题
|
Java
天猫面试官:说说高并发下的HashMap的死循环是怎么形成的!
师傅,我常常听别人说,不要在并发情况下使用HashMap,可能会出现死循环,这个死循环是怎么形成的呢?
192 0
|
JSON API 数据格式
FastAPI(6)- 详解 Query (下)
FastAPI(6)- 详解 Query (下)
428 0
FastAPI(6)- 详解 Query (下)
|
弹性计算 Linux
ECS使用之感受
通过这段时间的学习,了解掌握到了基本的云服务器的使用方法,感谢阿里云的飞天加速计划·高校学生在家实践,让更多的需要学习的小伙伴学到了知识,我也会去推荐给我的朋友来一起学习。