1. 程式人生 > 其它 >【java】【bio】【偽非同步IO程式設計】

【java】【bio】【偽非同步IO程式設計】

技術標籤:Java

b站視訊

老師講的還是比較清晰的,如有不清楚的,可以翻閱視訊
在這裡插入圖片描述

服務端程式碼

import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        try{
            System.out.println("=====服務端啟動=====");
            ServerSocket ss = new ServerSocket(9999
); HandlerSocketServerPool pool = new HandlerSocketServerPool(3, 10); while (true){ Socket socket = ss.accept(); pool.execute(new ServerRunnableTarget(socket)); } }catch (Exception ex){ System.out.println("有人下線了"
); ex.printStackTrace(); } } }

執行緒池程式碼

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class HandlerSocketServerPool {
    //建立一個執行緒池的成員變數用於儲存一個執行緒池物件
private ExecutorService executorService; //建立這個類的物件的時候需要初始化執行緒池物件 public HandlerSocketServerPool(int maxThreadNum, int queueSize){ executorService = new ThreadPoolExecutor(2, maxThreadNum, 120, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(queueSize)); } //提交任務給執行緒池處理 public void execute(Runnable target){ executorService.execute(target); } }

執行緒- 執行任務程式碼

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class ServerRunnableTarget implements Runnable {
    private Socket socket;

    public ServerRunnableTarget(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            String msg;
            while( (msg = reader.readLine()) != null ){
                System.out.println("服務端接收到:" + msg);
            }
        } catch (IOException e) {
            System.out.println("系統提醒:有人已下線!");
//            e.printStackTrace();
        }
    }
}

客戶端程式碼

import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) {
        //1.請求與伺服器端Socket物件連結
        //資源類放到try裡的寫法,是Java引入的新特性
        try{
            Socket socket = new Socket("127.0.0.1", 9999);
            //得到一個列印流
            PrintStream ps = new PrintStream(socket.getOutputStream());
            //使用迴圈不斷的傳送訊息給服務端接收
            while (true){
                Scanner scanner = new Scanner(System.in);
                System.out.print("請說");
                String msg = scanner.nextLine();
                ps.println(msg);
                ps.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}