package me.test.jdk.java.net.socket;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class MyEchoServer {
public static void main(String[] args) throws IOException {
new Thread(new Manager()).run();
}
/**
* 启动服务端监听socket,并将新的连接交由独立线程进行处理。
*/
private static class Manager implements Runnable {
@Override
public void run() {
ExecutorService exec = new ThreadPoolExecutor(3, 20, 1, TimeUnit.MINUTES,
new LinkedBlockingQueue<Runnable>());
ServerSocket serverSocket;
try {
serverSocket = new ServerSocket(9999);
Socket clientSocket;
while ((clientSocket = serverSocket.accept()) != null) {
exec.execute(new Worker(clientSocket));
}
} catch (IOException e) {
e.printStackTrace();
}
exec.shutdown();
}
}
/**
* 处理一个connection上的消息。
*/
private static class Worker implements Runnable {
private Socket socket;
public Worker(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
Reader reader = new InputStreamReader(new BufferedInputStream(socket.getInputStream()), "UTF-8");
Writer writer = new OutputStreamWriter(socket.getOutputStream(), "UTF-8");
int i = 0;
// blocking read
while ((i = reader.read()) != -1) {
char c = (char) i;
System.out.println("<<< " + socket + " : '" + c + "'");
writer.write(c);
writer.flush();
System.out.println(">>> " + socket + " : '" + c + "'");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}