谈谈传统BIO网络编程模型的局限性与NIO
先来看看我们的server端:
创建一个serversocket,进行监听,每来一个客户端,就启动一个新启动为其服务:
private void createListenSocket() {
//如果创建监听socket的时候发生异常,将会隔WAIT_TIME毫秒重试,直到成功
while (true){
try {
serverSocket = new ServerSocket(LISTEN_PORT);
Log.info(创建监听socket成功,正在监听...);
break;
} catch (IOException e) {
Log.error(创建监听socket失败,原因:+e.getMessage()+WAIT_TIME+ms后重建);
ThreadUtils.sleep(WAIT_TIME);
}
}
}
private void listen() throws IOException {
Socket socket = null;
//启动一个死循环来监听连接本服务器的socket
while ((socket = server.accept()) != null) {
// 来访客户记录到服务器:
Destination destination = new Destination();
destination.setSocket(socket);
server.newDestination(destination);
//启动一条子线程来处理连接本服务器的socket消息收发
new SubListenThread(destination,server).start();
}
}
以上代码来自我半年前编写的一个远控程序服务端。在这个模型当中,服务端线程与客户端线程是1:1的关系,也就是说有多少个客户端,服务端就得创建多少个线程。
在java当中,创建线程的代价是很大的。如果有几千个客户端,这个程序是撑不住的。
那么像旺旺这种在线量可以达到几百万的应用,在单个机器上,势必要用一种比BIO更好的编程模型来实现。
那么NIO就可以解决这种应用场景。
关于NIO的教程,网上有非常多的详细教程,在这里就不赘述。就简单说说NIO编程模型:
首先,我们有几个基本概念:
1.channel 大家可以把它想象成stream,只不过我们可以通过channel进行双工通信,也就是能读又能写。
2.buffer 可以看做是一段缓存,我们能通过这么一段缓存对channel进行读写。
3.selector 中文直接翻译过来就是选择器,因为在NIO当中,我们不通过传统的一个线程处理一个客户端,而是通过轮询的方式知道哪些客户端可读、可连接,从而实现1:n的模型。
那么NIO的编程模型如下:
通过一个selector,客户端会连接到这个selector,我们可以通过一个死循环不断地轮询selector有哪些客户端,然后一旦监听到可读或者可连接事件,我们就进行相应的业务逻辑处理,该读读,该写写。
以下为一个简单多人聊天室部分源码:
看起来还是很复杂的,至少比传统的BIO通信模型复杂。
使用原生的nio api进行编程很难,而且这玩意还有bug,据说在1.8以上版本仍存在空轮询BUG,会让CPU飙到100%。
所以说,如果可以的话,尽量使用一些第三方框架,比如netty。
谈谈传统BIO网络编程模型的局限性与NIO的更多相关文章
- Linux IO模型和网络编程模型
		
术语概念描述: IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者. 阻塞和非阻塞,是函数/方法的实现方式,即在数据就绪之前是立刻返回还是等待. 以文件IO为例,一个IO读过程是文件 ...
 - Java网络编程和NIO详解3:IO模型与Java网络编程模型
		
Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32 ...
 - linux网络编程模型
		
1.编程模型 Linux网络编程模型是基于socket的编程模型
 - [国嵌攻略][090][linux网络编程模型]
		
编程模型 Socket的实质就是一个接口,利用该接口,用户在使用不同的网络协议时,操作函数得以统一.而针对不同协议的差异性操作,则交给了Socket去自行解决. TCP编程模型 UDP编程模型
 - 【网络编程】Socket套接字网络编程模型
		
一.Linux网络模型 -- Socket套接字编程 图片:Socket 抽象层 Socket编程--不同协议,统一接口 Socket的实质就是一个接口, 利用该接口,用户在使用不同的网络协议时,操作 ...
 - 网络编程模型(C/S模型和B/S模型)
		
目录 网络应用编程模型 互联网与企业内部网 早期计算机网络的通信模型 C/S模式 B/S模式 B/S 和 C/S 的区别 网络应用编程模型 互联网与企业内部网 网络的两个含义: 互联网 :互联网(In ...
 - 谈谈c#中异步编程模型的变迁
		
大家在编程过程中都会用到一些异步编程的情况.在c#的BCL中,很多api都提供了异步方法,初学者可能对各种不同异步方法的使用感到迷惑,本文主要为大家梳理一下异步方法的变迁以及如何使用异步方法. Beg ...
 - iOS网络编程模型
		
iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...
 - 网络编程模型及TCP、UDP编程设计
		
1.Linux网络模型 Linux网络编程--->>>socket套接字的编程 2.TCP网络模型 ...
 
随机推荐
- JAVA获取汉字拼音首字母
			
package com.common.util; import java.io.UnsupportedEncodingException; /** * 取得给定汉字串的首字母串,即声母串 * Titl ...
 - python迭代-如何在一个for语句中迭代多个可迭代对象
			
如何在一个for语句中迭代多个可迭代对象 问题举例 (1)某班学生期末考试成绩,语文,数学,英语分别存储在3个列表中,同时迭代三个列表,计算每个学生的总分 (2)某年级有4个班,某次考试每班英语成绩分 ...
 - 我对MVC的理解
			
1. MVC :M模型 V视图 C控制器 1.1 模型是用来处理业务逻辑的,里面由许多类构成 1.2 视图是用来显示界面的 1.3 控制器是一个中间人,它通过视图的提交方式(post, ...
 - C++实验三
			
part2 graph.h #ifndef GRAPH_H#define GRAPH_H// 类Graph的声明 class Graph { public: Graph(char ch, int n) ...
 - php----------linux下安装php的swoole扩展
			
1.首先你已经安装好了php环境,这里就不介绍php环境的安装了.如果你是编译安装记得将php加入环境变量,以便于方便查看扩展是否安装成功. 2.我安装的php环境缺少了要给东西,详细看下图 如果你没 ...
 - 蓝桥杯近3年初赛题之三(17年b组)
			
1. 标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是 ...
 - C++——简单数据类型及布尔类型
			
一. 简单数据类型 数据类型描述了对象在内存存储区中占据的空间大小,描述了对象能够表示的数据范围 和类型.C++语言中常用的数据类型有整型.实型.字符型(这3种类型也被称之为简单数 据类型).数组类型 ...
 - Generator自动生成DAO和POJO代码
			
一 添加相关插件 <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>myba ...
 - CentOS 7 Squid代理服务器反向代理
			
Squid反向代理 将不同的URL请求分发到后台不同的Web服务器上,通过squid反向代理,可以加速网站的访问速度,同时互联网用户只能看到反向代理服务器的地址,加强网站的访问安全 Squid反向代理 ...
 - day12 python作业:员工信息表
			
作业要求: 周末大作业:实现员工信息表文件存储格式如下:id,name,age,phone,job1,Alex,22,13651054608,IT2,Egon,23,13304320533,Tearc ...