【java】【bio】【偽非同步IO程式設計】
阿新 • • 發佈:2021-01-31
技術標籤: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();
}
}
}