Netty-使用线程池优化BIO-代码实现

1、背景介绍

已知NIO的性质是每有一个新的连接请求就要新建一个线程与之连接,线程的创建对资源的消耗是很大的,可以使用之前学过的池化思想来节省线程资源

2、设计要求

使用BIO模型食记一个服务器端,监听某个端口,当有客户端请求连接时就启动一个线程与之通讯,服务器端可以接收服务器发生的数据
在这里插入图片描述

3、代码实现

代码分为两部分,第一部分是main函数,第二部分是handler函数,需要注意是是涉及到Socke和输入流的一些Java知识点

package BIO;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class BIOServer {
    public static void main(String[] args) throws IOException {
        //线程池:首先创建一个线程池,如果有客户端连接,就创建一个线程与之通讯
        ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
        
        //创建ServerSocket
        ServerSocket serverSocket = new ServerSocket(6666);
        
        System.out.println("服务器启动了");
        
        while(true){
            System.out.println("线程池信息   id=" + Thread.currentThread().getId() + 
                    " 名字 =" + Thread.currentThread().getName());
            //监听,等待客户端连接
            System.out.println("等待连接...");
            final Socket socket = serverSocket.accept();
            System.out.println("连接到一个客户端");
            
            //创建一个线程与之通讯
            newCachedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    //可以与客户端通讯
                    handler(socket);
                }
            });
        }
    }


    //重写run()涉及到的方法,handler方法负责与客户通讯
    public static void handler(Socket socket){
        try {
            System.out.println("线程池信息   id=" + Thread.currentThread().getId() +
                    " 名字 =" + Thread.currentThread().getName());
            byte[] bytes = new byte[1024];
            //通过Socket获取输入流
            InputStream inputStream = socket.getInputStream();
            //通过循环的方式读取客户端发送的数据
            while (true){
                System.out.println("线程池信息   id=" + Thread.currentThread().getId() +
                        " 名字 =" + Thread.currentThread().getName());
                System.out.println("read...");
                int read = inputStream.read(bytes);
                //输出客户端发送的数据
                if(read != -1){
                    System.out.println(new String(bytes,0,read));
                }else{
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            System.out.println("断开与client的连接");
            try {
                socket.close();
            } catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

4、测试程序

  • run上述测试代码

  • 打开cmd命令窗口输入 tenlnet 127.0.0.1 6666

  • 回车后发送数据 send okok,再回车客户端将发生数据
    在这里插入图片描述

  • 在IntellIJ下方BIOServer窗口即可查看相关信息,进行验证判断
    在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页