<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-4  評論-0  文章-0  trackbacks-0
    ?
      其實,簡單的分析一下,就可以看出客戶和服務通訊的主要通道就是Socket本身,而服務器通過accept方法就是同意和客戶建立通訊.這樣當客戶建立Socket的同時。服務器也會使用這一根連線來先后通訊,那么既然如此只要我們存在多條連線就可以了。那么我們的程序可以變為如下:

      服務器:

      import java.io.*;
      import java.net.*;

      public class MyServer {
      public static void main(String[] args) throws IOException{
      ServerSocket server=new ServerSocket(5678);
      while(true){
       Socket client=server.accept();
       BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
       PrintWriter out=new PrintWriter(client.getOutputStream());
       while(true){
        String str=in.readLine();
        System.out.println(str);
        out.println("has receive....");
        out.flush();
        if(str.equals("end"))
         break;
       }
       client.close();
      }
      }
      }

      這里僅僅只是加了一個外層的While循環,這個循環的目的就是當一個客戶進來就為它分配一個Socket直到這個客戶完成一次和服務器的交互,這里也就是接受到客戶的"End"消息.那么現在就實現了多客戶之間的交互了。但是.問題又來了,這樣做雖然解決了多客戶,可是是排隊執行的。也就是說當一個客戶和服務器完成一次通訊之后下一個客戶才可以進來和服務器交互,無法做到同時服務,那么要如何才能同時達到既能相互之間交流又能同時交流呢?很顯然這是一個并行執行的問題了。所以線程是最好的解決方案。

      那么下面的問題是如何使用線程.首先要做的事情是創建線程并使得其可以和網絡連線取得聯系。然后由線程來執行剛才的操作,要創建線程要么直接繼承Thread要么實現Runnable接口,要建立和Socket的聯系只要傳遞引用就可以了.而要執行線程就必須重寫run方法,而run方法所做的事情就是剛才單線程版本main所做的事情,因此我們的程序變成了這樣:

      import java.net.*;
      import java.io.*;

      public class MultiUser extends Thread{
      private Socket client;

      public MultiUser(Socket c){
      this.client=c;
      }

      public void run(){
      try{
       BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
       PrintWriter out=new PrintWriter(client.getOutputStream());
       //Mutil User but can parallel
       while(true){
        String str=in.readLine();
        System.out.println(str);
        out.println("has receive....");
        out.flush();
        if(str.equals("end"))
         break;
       }
       client.close();
      }catch(IOException ex){
      }finally{
      }
      }

      public static void main(String[] args)throws IOException{
      ServerSocket server=new ServerSocket(5678);
      while(true){
      //transfer location change Single User or Multi User
      MultiUser mu=new MultiUser(server.accept());
      mu.start();
      }
      }
      }

      我的類直接從Thread類繼承了下來.并且通過構造函數傳遞引用和客戶Socket建立了聯系,這樣每個線程就有了。一個通訊管道.同樣我們可以填寫run方法,把之前的操作交給線程來完成,這樣多客戶并行的Socket就建立起來了。

      以上的代碼使用的是

    BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
    PrintWriter out=new PrintWriter(client.getOutputStream());

      還有一種方法是使用

    DataInputStream isFromClient = new DataInputStream(client.getInputStream());
    DataOutputStream osToClient = new DataOutputStream(client.getOutputStream());

      關于這兩種輸入輸出流的不同,我也只知道前一種對字符串支持比較好,后面對于讀取一個字符串需要處理,但是可以支持很多種類型的輸出。對于傳遞字符串而言前一種應該是很好的選擇了。
    posted on 2006-07-01 09:38 磐石 閱讀(316) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 看全免费的一级毛片| 俄罗斯极品美女毛片免费播放| 亚洲 综合 国产 欧洲 丝袜| 亚洲精品偷拍无码不卡av| 四虎影视无码永久免费| 91亚洲国产成人久久精品 | 老司机精品视频免费| 亚洲大片免费观看| 亚洲AV成人无码久久精品老人| 免费观看四虎精品成人| 免费观看毛片视频| 亚洲 暴爽 AV人人爽日日碰| 久久WWW免费人成一看片| 亚洲人成网www| 蜜桃视频在线观看免费视频网站WWW| 国产亚洲成人久久| 亚洲国产精品免费视频| 亚洲不卡在线观看| 日韩在线视频免费看| 一区二区在线免费视频| 久久久久亚洲AV成人无码网站| 在线观看www日本免费网站| 亚洲日韩精品国产一区二区三区| 国产在线98福利播放视频免费| 人人爽人人爽人人片av免费| 国产av无码专区亚洲av桃花庵| 亚洲毛片在线免费观看| 亚洲爆乳AAA无码专区| 亚洲自偷自偷图片| av大片在线无码免费| 亚洲A∨精品一区二区三区下载| 中文字幕亚洲日本岛国片| 亚洲精品在线免费观看| 国产亚洲精品美女2020久久| 国产亚洲无线码一区二区 | 在线观看国产情趣免费视频| 国产精品美女久久久免费| 亚洲精品一区二区三区四区乱码| 在线观看亚洲免费视频| 久久午夜夜伦鲁鲁片无码免费| 亚洲色成人四虎在线观看|