古之成大事者,不唯有超世之才,亦唯有堅韌不拔之志也!

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            3 隨筆 :: 44 文章 :: 1 評論 :: 0 Trackbacks
          線程組式模
              每客戶一線程的模式增加了服務端的負荷,那么我們可以簡單的重用服務端處理線程。
              服務端重用一定的線程來處理客戶端請求,客戶端請求被放置到一個池中供并發(fā)線程取出處理
          package com.lei.socket.test;

          import java.io.BufferedReader;
          import java.io.BufferedWriter;
          import java.io.IOException;
          import java.io.InputStreamReader;
          import java.io.OutputStreamWriter;
          import java.net.ServerSocket;
          import java.net.Socket;
          import java.util.ArrayList;


          public class PooledClientServer {

              
              
          //啟動服務端監(jiān)聽
              public void start(){
                  
          try{
                      setUpHandlers();
                      ServerSocket server 
          = new ServerSocket(port);
                      Socket client 
          = null;
                      
          while(runFlag){
                          client 
          = server.accept();
                          System.out.println(
          "accept client " + client.getInetAddress().getHostAddress());
                          ClientHandle.handleClient(client);
                      }
                      server.close();
                  }
          catch(IOException e){
                      System.out.println(
          "start error");
                  }
              }
              
              
          //創(chuàng)建處理線程組
              public void setUpHandlers() {
                  
          for (int i = 0; i < threadNum; i++) {
                      ClientHandle ch 
          = new ClientHandle();
                      
          new Thread(ch, "Handler " + i).start();
                  }
              }
              
              
          public static void main(String[] args){
                  PooledClientServer s 
          = new PooledClientServer();
                  s.start();
              }
              
              
              
          private int port = 3000;
              
              
          //并發(fā)處理線程數
              private int threadNum = 3;
              
              
          private boolean runFlag = true;
          }



          //處理類
          class ClientHandle implements Runnable{

              
          public static void handleClient(Socket client) {
                  
          synchronized (pool) {
                      pool.add(client);
                      pool.notifyAll();
                  }
              }
              
              
          //處理客戶端
              private void handleClient(){
                  
          try{
                      BufferedReader inReader 
          = new BufferedReader(new InputStreamReader(client.getInputStream()));
                      BufferedWriter outWriter 
          = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
                      
          while(true){
                          outWriter.write(
          "please input String->");
                          outWriter.flush();
                          String str 
          = inReader.readLine();
                          
          if(str.equalsIgnoreCase("quit")){
                              outWriter.write(
          "quit ok");
                              client.close();
                              
          break;
                          }
                          
          else{
                              outWriter.write(
          "reulst is :" + new StringBuffer(str).reverse().toString());
                              outWriter.write(
          "\r\n");
                          }
                      }
                  }
          catch(IOException e){
                      System.out.println(
          "Handle client error");
                  }
              }
              
              
          public void run(){
                  
          while (true) {
                      
          synchronized (pool) {
                          
          while (pool.isEmpty()) {
                              
          try {
                                  pool.wait();
                              } 
          catch (InterruptedException e) {
                                  e.printStackTrace();
                                  
          return;
                              }
                          }
                          client 
          = (Socket) pool.remove(0);
                      }
                      handleClient();
                  }
              }
              
              
          private Socket client;
              
          private static ArrayList pool = new ArrayList();
          }


          posted on 2008-09-19 15:35 goto 閱讀(210) 評論(0)  編輯  收藏 所屬分類: SOCKET
          主站蜘蛛池模板: 新民市| 新平| 平利县| 北碚区| 疏勒县| 织金县| 乐山市| 黄梅县| 四平市| 北海市| 舟山市| 淮滨县| 延川县| 陇南市| 浠水县| 胶南市| 开封市| 湘潭市| 米脂县| 温泉县| 麻江县| 望城县| 庆安县| 舒兰市| 花莲市| 吴桥县| 宣威市| 汝州市| 宣化县| 广宗县| 平安县| 滦平县| 共和县| 昌都县| 东山县| 工布江达县| 肥东县| 广元市| 南投市| 长子县| 克什克腾旗|