我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

JavaNIO深入分析-创新互联

以下我们系统通过原理,过程等方便给大家深入的简介了Java NIO的函数机制以及用法等,学习下吧。

创新互联科技有限公司专业互联网基础服务商,为您提供成都温江机房高防主机,成都IDC机房托管,成都主机托管等互联网服务。

前言

本篇主要讲解Java中的IO机制

分为两块:
第一块讲解多线程下的IO机制
第二块讲解如何在IO机制下优化CPU资源的浪费(New IO)

Echo服务器

单线程下的socket机制就不用我介绍了,不懂得可以去查阅下资料
那么多线程下,如果进行套接字的使用呢?
我们使用最简单的echo服务器来帮助大家理解

首先,来看下多线程下服务端和客户端的工作流程图:

可以看到,多个客户端同时向服务端发送请求


服务端做出的措施是开启多个线程来匹配相对应的客户端


并且每个线程去独自完成他们的客户端请求

原理讲完了我们来看下是如何实现的


在这里我写了一个简单的服务器


用到了线程池的技术来创建线程(具体代码作用我已经加了注释):

public class MyServer {
  private static ExecutorService executorService = Executors.newCachedThreadPool();  //创建一个线程池
  private static class HandleMsg implements Runnable{   //一旦有新的客户端请求,创建这个线程进行处理
  Socket client;   //创建一个客户端
  public HandleMsg(Socket client){  //构造传参绑定
   this.client = client;
  }
  @Override
  public void run() {
   BufferedReader bufferedReader = null;  //创建字符缓存输入流
   PrintWriter printWriter = null;   //创建字符写入流
   try {
    bufferedReader = new BufferedReader(new InputStreamReader(client.getInputStream()));  //获取客户端的输入流
    printWriter = new PrintWriter(client.getOutputStream(),true);   //获取客户端的输出流,true是随时刷新
    String inputLine = null;
    long a = System.currentTimeMillis();
    while ((inputLine = bufferedReader.readLine())!=null){
     printWriter.println(inputLine);
    }
    long b = System.currentTimeMillis();
    System.out.println("此线程花费了:"+(b-a)+"秒!");
   } catch (IOException e) {
    e.printStackTrace();
   }finally {
    try {
     bufferedReader.close();
     printWriter.close();
     client.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }
 public static void main(String[] args) throws IOException {   //服务端的主线程是用来循环监听客户端请求
  ServerSocket server = new ServerSocket(8686);  //创建一个服务端且端口为8686
  Socket client = null;
  while (true){   //循环监听
   client = server.accept();  //服务端监听到一个客户端请求
   System.out.println(client.getRemoteSocketAddress()+"地址的客户端连接成功!");
   executorService.submit(new HandleMsg(client));  //将该客户端请求通过线程池放入HandlMsg线程中进行处理
  }
 }
}

本文标题:JavaNIO深入分析-创新互联
分享路径:http://shouzuofang.com/article/ggoid.html

其他资讯