客户端:
public class Client { private int port = 8000; private String host = "localhost"; private Socket socket; public Client() throws UnknownHostException, IOException { socket = new Socket(host, port); } public void readFromUser() throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line; while((line = br.readLine()) != null){ if(line.equals("bye")){ socket.close(); System.out.println("关闭socket"); break; } send(line); } } public void send(String msg) throws IOException { PrintWriter pw = new PrintWriter(socket.getOutputStream(), true); pw.println(msg); } public static void main(String args[]) throws UnknownHostException, IOException { new Client().readFromUser(); } }
服务端:
public class Server { private int port = 8000; private ServerSocket serverSocket; private ExecutorService executorService; private final int POOL_SIZE = 4; public Server() throws IOException { serverSocket = new ServerSocket(port, 2); // 创建线程池 executorService = Executors.newFixedThreadPool(Runtime.getRuntime() .availableProcessors() * POOL_SIZE); System.out.println("服务器启动。。。。。" + "初始线程数:" + Runtime.getRuntime().availableProcessors() * POOL_SIZE); } public void service() throws IOException { int count = 0; while (true) { Socket socket = serverSocket.accept(); System.out.println(++count + "客户端已链接"); // new Thread(new Handler(socket)).start(); executorService.execute(new Handler(socket)); } } public static void main(String args[]) throws IOException { new Server().service(); } private class Handler implements Runnable { private Socket socket; public Handler(Socket socket) { this.socket = socket; } public void run() { try { handle(); } catch (IOException e) { e.printStackTrace(); } } private void handle() throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(socket .getInputStream())); String line; while ((line = br.readLine()) != null) { if(line.equals("goodbye")){ socket.close(); serverSocket.close(); break; } System.out.println("From " + socket.getPort() + ":" + line); } } } }
服务器采用了JDK自带的线程池来处理并发请求。
还可以使用NIO来实现,即非阻塞通信
时间: 2024-10-26 08:16:57