1.服務器
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.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiThreadServer
{
private int port = 8821;
private ServerSocket serverSocket;
private ExecutorService executorService;// 線程池
private final int POOL_SIZE = 10;// 單個CPU線程池大小
public MultiThreadServer() throws IOException
{
serverSocket = new ServerSocket(port);
// Runtime的availableProcessor()方法返回當前系統的CPU數目.
executorService = Executors.newFixedThreadPool(Runtime.getRuntime()
.availableProcessors()
* POOL_SIZE);
System.out.println("服務器啟動");
}
public void service()
{
while (true)
{
Socket socket = null;
try
{
// 接收客戶連接,只要客戶進行了連接,就會觸發accept();從而建立連接
socket = serverSocket.accept();
executorService.execute(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("國際化"));
if (msg.equals("bye"))
break;
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
if (socket != null)
socket.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}

2.服務器處理程序
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.execute(createTask(i));
}
}
// 定義一個簡單的任務
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);
// 發送關閉命令
OutputStream socketOut = socket.getOutputStream();
socketOut.write("shutdown\r\n".getBytes());
// 接收服務器的反饋
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();
}
}
};
}
}


























































































































2.服務器處理程序





























































