ServerSocket服務端線程池處理demo

 

服務端線程池處理客戶端請求,拒絕策略ThreadPoolExecutor.AbortPolicy(),客戶端請求過大時Main線程拋異常:java.util.concurrent.RejectedExecutionException。實際業務可以切換其它拒絕策略。

package com.me.serverSocketDemo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ServerListener {

    private static final int port = 8888;
    ThreadPoolExecutor threadPoolExecutor =
            new ThreadPoolExecutor(2,5,5, TimeUnit.SECONDS,
                    new ArrayBlockingQueue<Runnable>(10), Executors.defaultThreadFactory(),
                    new ThreadPoolExecutor.AbortPolicy());

    public static void main(String[] args) {
        ServerListener serverListener = new ServerListener();
        serverListener.start();
    }

    public void start() {
        try {
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("開啓監聽:");
            while (true) {
                Socket socket = serverSocket.accept();
                threadPoolExecutor.execute(new HandlerThread(socket));
            }
        } catch (IOException e) {
            System.out.println("服務端異常!");
            e.printStackTrace();
        }
    }
}

class HandlerThread implements Runnable {

    private Socket socket ;
    public HandlerThread(Socket s) {
        socket = s;
        try {
            socket.setSoTimeout(10000);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        try {
            //讀取客戶端數據
            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String s = input.readLine();
            System.out.println("服務端收到客戶端發來的數據:" + s+ " 處理線程:" + Thread.currentThread().getName());

            Thread.sleep(200);
            input.close();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
        finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    socket = null;
                    System.out.println("服務端 finally 異常:" + e.getMessage());
                }
            }
        }

    }
}

 

client端代碼:

package com.me.serverSocketDemo;

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.UUID;

public class Client {
    public static final int port = 8888;
    public static final String host = "localhost";
    public static void main(String[] args) {
        System.out.println("Client run...");
        while (true) {
            Socket socket = null;
            try {
                //創建一個流套接字並將其連接到指定主機上的指定端口號
                socket = new Socket(host,port);

                //向服務器端發送數據
                PrintStream out = new PrintStream(socket.getOutputStream());

                String str ;
                for (int i = 0;i < 30; i++) { //建立一次連接發三十個消息到服務端
                    str = Thread.currentThread().getName() + ":" + UUID.randomUUID() + ":" + System.currentTimeMillis();
                    System.out.println("client send :" + str);
                    out.println(str);
                }
                out.close();
            } catch (Exception e) {
                System.out.println("客戶端異常:" + e.getMessage());
            } finally {
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        socket = null;
                        System.out.println("客戶端 finally 異常:" + e.getMessage());
                    }
                }
            }
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章