采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求。
1.服务端
# 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;//线程池
# 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(msg));
# if(msg.equals("bye"))
# break;
# }
# } catch (IOException e) {
# e.printStackTrace();
# }finally{
# try {
# if(socket!=null)
# socket.close();
# } catch (IOException e) {
# e.printStackTrace();
# }
# }
# }
# }
2.客户端
1. package sterning;
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. }
从而实现了多个客户端向服务器端发送请求,服务器端采用多线程的方式来处理的情况。
原文摘自:http://blog.csdn.net/flowerknight/archive/2009/06/14/4269052.aspx