BIO伪异步实现聊天效果
创建线程池
package com.zyd.bio.three;
import java.util.concurrent.*;
public class HandlerServerPool {
private ExecutorService executorService;
public HandlerServerPool(int maximumPoolSize, int queueSize){
/*
第一个参数 能处理的有效线程,
第二个参数 最大线程数
第三个参数 等待时长
第四个参数 等待时长单位
第五个参数 线程队列
*/
executorService = new ThreadPoolExecutor(2,
maximumPoolSize,
120,
TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(queueSize));
}
/*
提交任务给线程池的任务队列来暂存,等着线程池来处理
*/
public void execute(Runnable target){
executorService.execute(target);
}
}
编写socket服务端
package com.zyd.bio.three;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
//初始化线程池对象
HandlerServerPool pool = new HandlerServerPool(6, 10);
while(true){
//启动会等待,直到有客户端连接
Socket accept = serverSocket.accept();
//存入线程池
pool.execute(new ServerThread(accept));
}
}
}
服务端多线程
package com.zyd.bio.three;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class ServerThread implements Runnable{
private Socket socket;
public ServerThread(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg ;
System.out.println(socket);
while ((msg=bufferedReader.readLine())!=null){
System.out.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端连接
package com.zyd.bio.one;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 9999);
OutputStream outputStream = socket.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
Scanner scanner = new Scanner(System.in);
while(true){
System.out.print("请说:");
String msg = scanner.next();
printStream.println(msg);
printStream.flush();
}
}
}