首页 > 编程语言 >java网络编程-线程池服务端

java网络编程-线程池服务端

时间:2023-02-28 10:37:07浏览次数:42  
标签:java socket 线程 new public 服务端 Socket

上篇文章我们借助线程实现了服务端可以服务多个客户端,但是每次请求进来都创建新线程也是一种很大的资源消耗,线程上下文切换都会影响性能。

本次我们继续对服务端进行改造,引入一个线程池,限制服务端的资源总量,并对服务端使用线程进行复用。

线程池:

public class SocketThreadPool {
    private ExecutorService executor;

    public SocketThreadPool(int maxPoolSize, int queueSize) {
        this.executor = new ThreadPoolExecutor(3,
                maxPoolSize,
                120L,
                TimeUnit.SECONDS, new ArrayBlockingQueue<>(queueSize));
    }

    public void execute(Runnable task){
        this.executor.execute(task);
    }
}

服务端task

public class ServerTask implements Runnable{
    private Socket socket;

    public ServerTask(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            //4.把字节输入流包装成自己需要的流进行数据的读取。
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            //5.循环读取数据并打印到屏幕
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println("收到:" + line);
            }
        } catch (IOException e) {
            System.out.println(socket.getRemoteSocketAddress() + "下线!");
        }
    }
}

服务端:

public class Server {

    public static void main(String[] args) {
        System.out.println("==服务器的启动==");
        // 1.注册端口
        try {
            ServerSocket serverSocket = new ServerSocket(8888);
            SocketThreadPool threadPool = new SocketThreadPool(3, 100);
            while (true) {
                //2.每接收到客户端的连接,就新建一个线程进行处理
                Socket socket = serverSocket.accept();
                threadPool.execute(new ServerTask(socket));
                System.out.println(socket.getRemoteSocketAddress() + "上线!");
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

客户端代码不变

public class Client {
    public static void main(String[] args) throws Exception {
        System.out.println("==客户端的启动==");
        // 1.创建一个Socket的通信管道,请求与服务端的端口连接。
        Socket socket = new Socket("127.0.0.1", 8888);
        // 2.从Socket通信管道中得到一个字节输出流。
        OutputStream os = socket.getOutputStream();
        // 3.把字节流改装成自己需要的流进行数据的发送
        PrintStream ps = new PrintStream(os);
        // 4.开始发送消息
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            String msg = sc.nextLine();
            ps.println(msg);
            ps.flush();
        }
    }
}

 

标签:java,socket,线程,new,public,服务端,Socket
From: https://www.cnblogs.com/wangbin2188/p/17163057.html

相关文章

  • java调用c++的几种方式
    jni类似c#调用c++的方式,定义java端的c++代码接口。packagecrayon.jni;publicclassJNITest{publicnativestaticvoidset(inti);publicna......
  • Java学习笔记12
    正则表达式1.概述​ 在Java中,我们经常需要验证一些字符串,例如:年龄必须是2位的数字、用户名必须是8位长度而且只能包含大小写字母、数字等。正则表达式就是用来验证各种字......
  • 基础Java学习笔记(一)
    学习笔记01两年前学的Java,现在已经忘得差不多了,跟着狂神说Java的视频从头开始学,希望能救一救ww一、JDKJREJVM1.JDKjavadevelopmentkit2.JREjavaRuntimeEnvir......
  • java网络编程-并发服务端
    上次的服务端一次只能接受一个客户端的连接,性能实在堪忧,我们对服务端进行了改造,每接到一个客户端的请求,就新建一个线程,让新线程跟客户端进行交互,主线程可以继续等待其他客......
  • java面试题-列举常见的异常
    面试中经常会被问到,列举几种常见异常。怎么能被这个难倒呢?下面随便列举些,以及触发例子。文章目录​​NullPointerException​​​​ArithmeticException​​​​NumberFor......
  • java使用gzip压缩和解压
    代码如下:publicclassGZipUtils{publicstaticfinalintBUFFER=1024;publicstaticfinalStringEXT=".gz";publicstaticvoidmain(String[]args)......
  • java使用commons-lang3
    pom.xml中添加<!--https://mvnrepository.com/artifact/org.apache.commons/commons-lang3--><dependency><groupId>org.apache.commons</groupId><artifactId>co......
  • java常用系统属性System.getProperties().getProperty()
    用法例子:System.out.println(System.getProperties().getProperty("user.home"));常用属性列表:属性含义java.versionJava运行时环境版本java.vendorJava运行时环境供应商jav......
  • java8 flatmap的使用
    Useruser=newUser(“[email protected]”,“1234”);user.setPosition(“Developer”);Stringposition=Optional.ofNullable(user).flatMap(u->u.getPosition()).......
  • java中输出方框(未知字符)
    这说明是空白字符,注意不是空字符串,也不是null。他是unicode中的\u0000也就是NULL.哪些场景会出现该情况?char数组中有未设定的字符,会当做空白字符来打印publicstaticvo......