It's an implementation that can sent requests from multi-clients to
server, meanwhile, the server handle the requests by multi-thread.
1. Server side code:
1 package com.googlesites.qslbinghamton.corejava.socket;
2
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.io.InputStreamReader;
7 import java.io.OutputStream;
8 import java.io.PrintWriter;
9 import java.net.*;
10 import java.util.concurrent.*;
11
12 public class MultiThreadServer {
13 private int port=8821;
14 private ServerSocket serverSocket;
15 private ExecutorService executorService;//线程池
16 private final int POOL_SIZE=10;//单个CPU线程池大小
17
18 public MultiThreadServer() throws IOException{
19 serverSocket=new ServerSocket(port);
20 //Runtime的availableProcessor()方法返回当前系统的CPU数目.
21 executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
22 System.out.println("服务器启动");
23 }
24
25 public void service(){
26 while(true){
27 Socket socket=null;
28 try {
29 //接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
30 socket=serverSocket.accept();
31 executorService.execute(new Handler(socket));
32
33 } catch (Exception e) {
34 e.printStackTrace();
35 }
36 }
37 }
38
39 public static void main(String[] args) throws IOException {
40 new MultiThreadServer().service();
41 }
42
43 }
44
45 class Handler implements Runnable{
46 private Socket socket;
47 public Handler(Socket socket){
48 this.socket=socket;
49 }
50 private PrintWriter getWriter(Socket socket) throws IOException{
51 OutputStream socketOut=socket.getOutputStream();
52 return new PrintWriter(socketOut,true);
53 }
54 private BufferedReader getReader(Socket socket) throws IOException{
55 InputStream socketIn=socket.getInputStream();
56 return new BufferedReader(new InputStreamReader(socketIn));
57 }
58 public String echo(String msg){
59 return "echo:"+msg;
60 }
61 public void run(){
62 try {
63 System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
64 BufferedReader br=getReader(socket);
65 PrintWriter pw=getWriter(socket);
66 String msg=null;
67 while((msg=br.readLine())!=null){
68 System.out.println(msg);
69 pw.println(echo(msg));
70 if(msg.equals("bye"))
71 break;
72 }
73 } catch (IOException e) {
74 e.printStackTrace();
75 }finally{
76 try {
77 if(socket!=null)
78 socket.close();
79 } catch (IOException e) {
80 e.printStackTrace();
81 }
82 }
83 }
84 }
2. Client side code
1 package com.googlesites.qslbinghamton.corejava.socket;
2
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStreamReader;
6 import java.io.OutputStream;
7 import java.net.Socket;
8 import java.util.concurrent.ExecutorService;
9 import java.util.concurrent.Executors;
10
11 public class MultiThreadClient {
12
13 public static void main(String[] args) {
14 int numTasks = 10;
15
16 ExecutorService exec = Executors.newCachedThreadPool();
17
18 for (int i = 0; i < numTasks; i++) {
19 exec.execute(createTask(i));
20 }
21
22 }
23
24 // 定义一个简单的任务
25 private static Runnable createTask(final int taskID) {
26 return new Runnable() {
27 private Socket socket = null;
28 private int port=8821;
29
30 public void run() {
31 System.out.println("Task " + taskID + ":start");
32 try {
33 socket = new Socket("localhost", port);
34 // 发送关闭命令
35 OutputStream socketOut = socket.getOutputStream();
36 socketOut.write("shutdown\r\n".getBytes());
37
38 // 接收服务器的反馈
39 BufferedReader br = new BufferedReader(
40 new InputStreamReader(socket.getInputStream()));
41 String msg = null;
42 while ((msg = br.readLine()) != null)
43 System.out.println(msg);
44 } catch (IOException e) {
45 e.printStackTrace();
46 }
47 }
48
49 };
50 }
51 }
52