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

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            3 隨筆 :: 44 文章 :: 1 評(píng)論 :: 0 Trackbacks
          線(xiàn)程組式模
              每客戶(hù)一線(xiàn)程的模式增加了服務(wù)端的負(fù)荷,那么我們可以簡(jiǎn)單的重用服務(wù)端處理線(xiàn)程。
              服務(wù)端重用一定的線(xiàn)程來(lái)處理客戶(hù)端請(qǐng)求,客戶(hù)端請(qǐng)求被放置到一個(gè)池中供并發(fā)線(xiàn)程取出處理
          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 {

              
              
          //啟動(dòng)服務(wù)端監(jiān)聽(tīng)
              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)建處理線(xiàn)程組
              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ā)處理線(xiàn)程數(shù)
              private int threadNum = 3;
              
              
          private boolean runFlag = true;
          }



          //處理類(lèi)
          class ClientHandle implements Runnable{

              
          public static void handleClient(Socket client) {
                  
          synchronized (pool) {
                      pool.add(client);
                      pool.notifyAll();
                  }
              }
              
              
          //處理客戶(hù)端
              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) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): SOCKET
          主站蜘蛛池模板: 黄浦区| 济阳县| 临湘市| 金塔县| 通渭县| 岚皋县| 固始县| 麦盖提县| 文山县| 黄陵县| 襄汾县| 红原县| 天津市| 治县。| 平果县| 桃源县| 株洲市| 阜南县| 安图县| 元江| 河池市| 榆社县| 南开区| 罗田县| 惠安县| 北川| 巫溪县| 伊春市| 西昌市| 延寿县| 大新县| 金沙县| 满城县| 江西省| 道孚县| 那坡县| 镇远县| 姚安县| 大厂| 秀山| 和硕县|