当前位置: 首页 > news >正文

宜昌网站建设开发团队云南测绘公司最新排名

宜昌网站建设开发团队,云南测绘公司最新排名,辽宁住房和城乡建设部网站,做网站大概需要几步目录 一、BIO特点介绍二、BIO代码实现2.1、客户端代码准备2.2、服务端单线程处理2.2.1、服务端代码2.2.2、阻塞代码分析2.2.3、存在问题 2.3、服务端多线程处理2.3.1、服务端代码2.3.2、存在问题 一、BIO特点介绍 BIO(blocking I/O)#xff1a;同步阻塞IO#xff0c;在每个I… 目录 一、BIO特点介绍二、BIO代码实现2.1、客户端代码准备2.2、服务端单线程处理2.2.1、服务端代码2.2.2、阻塞代码分析2.2.3、存在问题 2.3、服务端多线程处理2.3.1、服务端代码2.3.2、存在问题 一、BIO特点介绍 BIO(blocking I/O)同步阻塞IO在每个I/O操作如读取或写入都会导致线程被阻塞直到操作完成。BIO方式适用于连接数目比较小且固定的架构这种模型适合于较低的并发需求每个连接通常都需要一个独立的线程也可以使用线程池管理JDK1.4以前的唯一选择程序简单易理解。BIO是基于字节流和字符流进行操作的。使用java.io包中的类如InputStream和OutputStream它们提供了阻塞式的I/O操作。 二、BIO代码实现 2.1、客户端代码准备 这里准备一个通用的客户端会给服务端发送两条消息发送时间间隔2秒用于做后面的测试。 public class BioClient{public static void main(String[] args) {for (int i0;i1;i) {// 这里使用多线程处理为了适配多线程服务端new Thread(()-{BioClient bioClient new BioClient();try {bioClient.run();} catch (Exception e) {e.printStackTrace();}}).start();}}public void run() throws Exception{Socket socket null;InputStream inputStream null;OutputStream outputStream null;BufferedReader br null;try {socket new Socket(127.0.0.1, 9998);System.out.println(getTime() 和服务端建立连接);Thread.sleep(2000);outputStream socket.getOutputStream();PrintStream ps new PrintStream(outputStream);System.out.println(getTime() 给服务端发送消息hello);ps.println(hello);Thread.sleep(2000);System.out.println(getTime() 间隔2秒在给服务端发送消息end);ps.println(end);ps.flush();inputStream socket.getInputStream();br new BufferedReader(new InputStreamReader(inputStream));String s null;System.out.println(getTime() 阻塞等待服务端发送给客户端的数据);while ((s br.readLine()) ! null) {System.out.println(getTime() Thread.currentThread().getName() 接收到服务端的数据 s);}} finally {br.close();inputStream.close();outputStream.close();socket.close();}}public static String getTime(){return time System.currentTimeMillis()/1000 \t;} }2.2、服务端单线程处理 2.2.1、服务端代码 import java.io.*; import java.net.ServerSocket; import java.net.Socket;public class BioServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket new ServerSocket(9998);while (true) {// 阻塞等待socket连接Socket accept serverSocket.accept();System.out.println(getTime() 建立连接 port accept.getPort());InputStream inputStream accept.getInputStream();BufferedReader br new BufferedReader(new InputStreamReader(inputStream));//连接后阻塞等待连接数据输入String s null;while ((s br.readLine()) ! null) {System.out.println(getTime() Thread.currentThread().getName() 接收到的数据 s);// 当收到end消息时给客户端发送一个消息,并且关闭流跳出当前循环if (end.equals(s)) {PrintStream ps new PrintStream(accept.getOutputStream());ps.println(早点睡);ps.flush();System.out.println(getTime() 收到end消息时给客户端发送一个消息完毕);br.close();inputStream.close();accept.close();break;}}System.out.println(getTime() 一次连接处理完成等待下一个连接);System.out.println(-----------------------------------------------------------);}}public static String getTime() {return time System.currentTimeMillis() / 1000 \t;} }2.2.2、阻塞代码分析 BIO有两个地方会阻塞线程第一个就是在serverSocket.accept();时当没有连接建立时会一直等待当有连接进入时开始执行后续流程我这个例子中建立连接后会获取输入流读取客户端发送的消息在调用br.readLine()方法真正读取数据时如果客户端还没有发送消息只是建立了连接这一步也是会阻塞的我在客户端建立socket连接后会暂停2秒才给服务端发送消息所以这里会阻塞2s当客户端暂停结束后会给服务端发送一条消息当消息发送到服务端服务端br.readLine()方法读取到数据开始执行后续流程因为这里是循环读取的所以第一条消息读取完之后又会执行br.readLine()方法这时又会阻塞等待客户端消息客户端发送第一条消息后间隔2s会再次给服务端发送一条消息消息内容为end服务端br.readLine()方法读取到第二条数据后判断消息内容是否为end如果为end则给客户端发送一条早点睡发送完毕后会将流和连接全部关闭并且跳出循环等待下一个连接。 2.2.3、存在问题 BIO单线程同时只能处理一个连接当调用br.readLine()方法读取数据时会阻塞只有当连接断开或者读取到一次数据后才会执行后续逻辑也就是说如果连接没有断开客户端一直不给服务端发送消息那么服务端就会一直阻塞我们这里的代码读取一次数据后还会继续循环读取直到读到end才会自己跳出循环如果不跳出循环连接不断开则其它连接处理。BIO一般情况下无法使用一个线程处理多个连接其实也是可以的设想我们将获取到的socket存储在数组里每收到两个socket再去处理这样就能一个线程处理两个socket连接了但是肯定不会这样做因为serverSocket.accept();会阻塞如果只来了一个连接那么这个连接就一直不会处理了。针对这些问题竟然单线程无法处理那么下面使用多线程处理继续分析。 2.3、服务端多线程处理 2.3.1、服务端代码 import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit;public class BioConcurrentServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket new ServerSocket(9998);ThreadPoolExecutor threadPoolExecutor new ThreadPoolExecutor(2, 2, 10, TimeUnit.SECONDS, new LinkedBlockingQueue(100));while (true) {// 阻塞等待socket连接Socket accept serverSocket.accept();System.out.println(getTime() 建立连接 port accept.getPort());// 将socket连接交由线程池处理threadPoolExecutor.execute(()-{try {System.out.println(getTime() 开始处理socket消息);run(accept);} catch (Exception e) {throw new RuntimeException(e);}});}}public static void run(Socket accept) throws Exception {InputStream inputStream accept.getInputStream();BufferedReader br new BufferedReader(new InputStreamReader(inputStream));//连接后阻塞等待连接数据输入String s null;while ((s br.readLine()) ! null) {System.out.println(getTime() Thread.currentThread().getName() 接收到的数据 s);// 当收到end消息时给客户端发送一个消息,并且关闭流跳出当前循环if (end.equals(s)) {PrintStream ps new PrintStream(accept.getOutputStream());ps.println(早点睡);ps.flush();System.out.println(getTime() 收到end消息时给客户端发送一个消息完毕);br.close();inputStream.close();accept.close();break;}}System.out.println(getTime() 一次连接处理完成等待下一个连接);System.out.println(-----------------------------------------------------------);}public static String getTime() {return time System.currentTimeMillis() / 1000 \t;} }2.3.2、存在问题 在接收到客户端连接后使用线程池处理 Read / Write 这样就能同时处理多个连接看着好像没有什么问题但是仔细想想如果客户端只是建立了连接没有给服务端发送消息那么服务端在子线程调用br.readLine()时是不是会一直阻塞那么就会一直占用线程这也就说明了为什么BIO中通常一个连接就需要一个线程。
http://www.huolong8.cn/news/334666/

相关文章:

  • 网站建设捌金手指花总八库车网站建设
  • 可视化网站模板编辑软件公司内部展厅设计
  • 做外贸比较好用的网站网站的建设的含义
  • wordpress不能添加用户芜湖seo外包公司
  • 四川华泰建设集团网站南京高端网站建设公司
  • 网站台做计么呢邢台天九建设有限公司网站
  • 公司可以备案几个网站高中信息技术网站建设
  • 本地网站开发公司网络服务大厅
  • 网页设计与网站建设实训目的网易工作做网站工资奖金高吗
  • app开发cms网站开发苏州网站制作出名 乐云践新
  • 坪山网站建设公司网站建设协议书 印花税
  • 北京正规网站建设比较推广普通话喜迎二十手抄报
  • 网站开发细节国外搜索引擎排名
  • 网站域名缴费十年wordpress整合vip解析
  • 西青做网站的公司徐州网页关键词优化
  • 周到的宁波网站建设贵州建设官方网站
  • 网站百度优化韩国唯美网站设计
  • 只做正品的购物网站宁波网站建设与设计开发
  • 有哪些做的比较好的网站上不了国外网站怎么做外贸
  • 自己有网站怎么推广营销策略怎么写范文
  • 营销网站的策划方案怎么做佛山南海区建网站的公司
  • 研学网站平台建设方案论坛发帖
  • 厦门网站建设价格xm37郑州专门做网站的公司
  • 设计班级网站建设固安企业网站建设
  • 重庆电子网站建设做网站4000-262-263
  • 网站还能赚钱吗wordpress地址更改
  • 邢台做wap网站的公司锦屏县城乡和建设局网站
  • 江苏系统建站怎么用朝阳区网站开发公司
  • 网站seo快速优化技巧关于网站建设的几点体会
  • 手机触屏版网站广告投放平台主要有哪些