隨筆 - 303  文章 - 883  trackbacks - 0
          <2007年2月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728123
          45678910

          歡迎光臨! 
          閑聊 QQ:1074961813

          隨筆分類(357)

          我管理的群

          公共blog

          • n維空間
          • Email : java3d@126.com 群 : 12999758

          參與管理的論壇

          好友的blog

          我的其他blog

          朋友的網站

          搜索

          •  

          最新評論

          ServerSocket用法詳解 教程下載?? 源代碼下載

          嗨,大家好,我是尋覓:各位JAVA愛好者你現在看到是本人摘取上面教程的一部分,即我和一個網友遇到的問題,和解決。如果你對ServerSocket用法很重視,想系統學習;請下載上面的教程(來自:developer.51cto.com),謝謝支持 !

          3.6? 創建多線程的服務器

          在本書第1章的1.5.1節的例程1-2的EchoServer中,其service()方法負責接收客戶連接,以及與客戶通信。service()方法的處理流程如下:

          while (true) {

          Socket socket=null;

          try {

          socket = serverSocket.accept();? ???//接收客戶連接

          //從Socket中獲得輸入流與輸出流,與客戶通信





          }catch (IOException e) {

          e.printStackTrace();

          }finally {

          try{

          if(socket!=null)socket.close();? ??//斷開連接

          }catch (IOException e) {e.printStackTrace();}

          }

          }

          EchoServer接收到一個客戶連接,就與客戶進行通信,通信完畢后斷開連接,然后再接收下一個客戶連接。假如同時有多個客戶請求連接,這些客戶就必須排隊等候EchoServer的響應。EchoServer無法同時與多個客戶通信。

          許多實際應用要求服務器具有同時為多個客戶提供服務的能力。HTTP服務器就是最明顯的例子。任何時刻,HTTP服務器都可能接收到大量的客戶請求,每個客戶都希望能快速得到HTTP服務器的響應。如果長時間讓客戶等待,會使網站失去信譽,從而降低訪問量。

          可以用并發性能來衡量一個服務器同時響應多個客戶的能力。一個具有好的并發性能的服務器,必須符合兩個條件:

          ◆能同時接收并處理多個客戶連接;

          ◆對于每個客戶,都會迅速給予響應。

          服務器同時處理的客戶連接數目越多,并且對每個客戶作出響應的速度越快,就表明并發性能越高。

          用多個線程來同時為多個客戶提供服務,這是提高服務器的并發性能的最常用的手段。本節將按照3種方式來重新實現EchoServer,它們都使用了多線程。

          ◆為每個客戶分配一個工作線程。

          ◆創建一個線程池,由其中的工作線程來為客戶服務。

          ◆利用JDK的Java類庫中現成的線程池,由它的工作線程來為客戶服務。

          3.6.1? 為每個客戶分配一個線程

          服務器的主線程負責接收客戶的連接,每次接收到一個客戶連接,就會創建一個工作線程,由它負責與客戶的通信。以下是EchoServer的service()方法的代碼:

          public void service() {

          while (true) {

          Socket socket=null;

          try {

          socket = serverSocket.accept();? ????//接收客戶連接

          Thread workThread=new Thread(new Handler(socket));? ?//創建一個工作線程

          workThread.start();? ??????//啟動工作線程

          }catch (IOException e) {

          e.printStackTrace();

          }

          }

          }

          以上工作線程workThread執行Handler的run()方法。Handler類實現了Runnable接口,它的run()方法負責與單個客戶通信,與客戶通信結束后,就會斷開連接,執行Handler的run()方法的工作線程也會自然終止。如例程3-5所示是EchoServer類及Handler類的源程序。

          例程3-5? EchoServer.java(為每個任務分配一個線程)

          package multithread1;

          import java.io.*;

          import java.net.*;

          public class EchoServer {

          private int port=8000;

          private ServerSocket serverSocket;

          public EchoServer() throws IOException {

          serverSocket = new ServerSocket(port);

          System.out.println("服務器啟動");

          }

          public void service() {

          while (true) {

          Socket socket=null;

          try {

          socket = serverSocket.accept();? ????//接收客戶連接

          Thread workThread=new Thread(new Handler(socket));? ?//創建一個工作線程

          workThread.start();? ??????//啟動工作線程

          }catch (IOException e) {

          e.printStackTrace();

          }

          }

          }

          public static void main(String args[])throws IOException {

          new EchoServer().service();

          }

          }

          class Handler implements Runnable{? ?????//負責與單個客戶的通信

          private Socket socket;

          public Handler(Socket socket){

          this.socket=socket;

          }

          private PrintWriter getWriter(Socket socket)throws IOException{…}

          private BufferedReader getReader(Socket socket)throws IOException{…}

          public String echo(String 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();}

          }

          }

          }




          ?



          地震讓大伙知道:居安思危,才是生存之道。
          posted on 2007-02-22 23:05 小尋 閱讀(1278) 評論(0)  編輯  收藏 所屬分類: j2se/j2ee/j2menetwork
          主站蜘蛛池模板: 吴桥县| 平山县| 息烽县| 泉州市| 柘城县| SHOW| 浮梁县| 徐闻县| 桂林市| 瓮安县| 双流县| 株洲市| 巴塘县| 湘潭县| 济阳县| 营口市| 称多县| 合作市| 勐海县| 长沙县| 北安市| 乐都县| 蒲江县| 鄂尔多斯市| 霍林郭勒市| 克什克腾旗| 嘉鱼县| 锡林浩特市| 墨江| 武宣县| 阳原县| 万载县| 昭通市| 台南市| 含山县| 永定县| 罗源县| 鄢陵县| 罗山县| 南安市| 鹰潭市|