多線程Java Socket編程示例

jopen 10年前發布 | 29K 次閱讀 Socket Java開發

采用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(); } } } } </pre>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();
            }
        }

    } ;
}

}</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!