java nio_Java NIO详解

前言

本篇主要讲解Java中的IO机制和网络通讯中处理高并发的NIO

分为两块:

第一块讲解多线程下的IO机制

第二块讲解如何在IO机制下优化CPU资源的浪费(New IO)

Echo服务器

单线程下的socket机制就不用我介绍了,不懂得可以去查阅下资料

那么多线程下,如果进行套接字的使用呢?

我们使用最简单的echo服务器来帮助大家理解

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

bVZJhE?w=372&h=164

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

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

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

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

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

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

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线程中进行处理

}

}

}

上述代码中我们使用一个类编写了一个简单的echo服务器

在主线程中用死循环来开启端口监听

简单客户端

有了服务器,我们就可以对其进行访问,并且发送一些字符串数据

服务器的功能是返回这些字符串,并且打印出线程占用时间

下面来写个简单的客户端来响应服务端:

public class MyClient {

public static void main(String[] args) throws IOException {

Socket client = null;

PrintWriter printWriter = null;

BufferedReader bufferedReader = null;

try {

client = new Socket();

client.connect(new InetSocketAddress("localhost",8686));

printWriter = new PrintWriter(client.getOutputStream(),true);

printWriter.println("hello");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值