1. Server
Package sterning;
Import java. io. BufferedReader;
Import java. io. IOException;
Import java. io. InputStream;
Import java. io. InputStreamReader;
Import java. io. OutputStream;
Import java. io. PrintWriter;
Import java.net .*;
Import java. util. concurrent .*;
Public class MultiThreadServer {
Private int port = 8821;
Private ServerSocket serverSocket;
Private ExecutorService executorService; // Thread Pool
Private final int POOL_SIZE = 10; // the size of a single CPU Thread Pool
Public MultiThreadServer () throws IOException {
ServerSocket = new ServerSocket (port );
// The availableProcessor () method of Runtime returns the number of CPUs of the current system.
ExecutorService = Executors. newFixedThreadPool (Runtime. getRuntime (). availableProcessors () * POOL_SIZE );
System. out. println ("server startup ");
}
Public void service (){
While (true ){
Socket socket = null;
Try {
// Receive the customer connection. Once the customer connects, accept () is triggered to establish the connection.
Socket = serverSocket. accept ();
ExecutorService.exe cute (new Handler (socket ));
} Catch (Exception e ){
E. printStackTrace ();
}
}
}
Public static void main (String [] args) throws IOException {
New MultiThreadServer (). service ();
}
}
Class Handler implements Runnable {
Private Socket socket;
Public Handler (Socket socket ){
This. socket = socket;
}
Private PrintWriter getWriter (Socket socket) throws IOException {
OutputStream socketOut = socket. getOutputStream ();
Return new PrintWriter (socketOut, true );
}
Private BufferedReader getReader (Socket socket) throws IOException {
InputStream socketIn = socket. getInputStream ();
Return new BufferedReader (new InputStreamReader (socketIn ));
}
Public String echo (String msg ){
Return "echo:" + msg;
}
Public void run (){
Try {
System. out. println ("New connection accepted" + socket. getInetAddress () + ":" + socket. getPort ());
BufferedReader br = getReader (socket );
PrintWriter pw = getWriter (socket );
String msg = null;
While (msg = br. readLine ())! = Null ){
System. out. println (msg );
Pw. println (echo (msg ));
If (msg. equals ("bye "))
Break;
}
} Catch (IOException e ){
E. printStackTrace ();
} Finally {
Try {
If (socket! = Null)
Socket. close ();
} Catch (IOException e ){
E. printStackTrace ();
}
}
}
}
2. Client
Package sterning;
Import java. io. BufferedReader;
Import java. io. IOException;
Import java. io. InputStreamReader;
Import java. io. OutputStream;
Import java.net. Socket;
Import java. util. concurrent. ExecutorService;
Import java. util. concurrent. Executors;
Public class MultiThreadClient {
Public static void main (String [] args ){
Int numTasks = 10;
ExecutorService exec = Executors. newCachedThreadPool ();
For (int I = 0; I <numTasks; I ++ ){
Exec.exe cute (createTask (I ));
}
}
// Define a simple task
Private static Runnable createTask (final int taskID ){
Return new Runnable (){
Private Socket socket = null;
Private int port = 8821;
Public void run (){
System. out. println ("Task" + taskID + ": start ");
Try {
Socket = new Socket ("localhost", port );
// Send the close command
OutputStream socketOut = socket. getOutputStream ();
SocketOut. write ("shutdown/r/n". getBytes ());
// Receive server feedback
BufferedReader br = new BufferedReader (
New InputStreamReader (socket. getInputStream ()));
String msg = null;
While (msg = br. readLine ())! = Null)
System. out. println (msg );
} Catch (IOException e ){
E. printStackTrace ();
}
}
};
}
}