多线程Java Socket编程示例

jopen 10年前

采用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.客户端
 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();                  }              }            } ;      }  }