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

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

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

    隨筆-4  評(píng)論-0  文章-0  trackbacks-0
    ?
      其實(shí),簡(jiǎn)單的分析一下,就可以看出客戶和服務(wù)通訊的主要通道就是Socket本身,而服務(wù)器通過accept方法就是同意和客戶建立通訊.這樣當(dāng)客戶建立Socket的同時(shí)。服務(wù)器也會(huì)使用這一根連線來先后通訊,那么既然如此只要我們存在多條連線就可以了。那么我們的程序可以變?yōu)槿缦?

      服務(wù)器:

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

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

      那么下面的問題是如何使用線程.首先要做的事情是創(chuàng)建線程并使得其可以和網(wǎng)絡(luò)連線取得聯(lián)系。然后由線程來執(zhí)行剛才的操作,要?jiǎng)?chuàng)建線程要么直接繼承Thread要么實(shí)現(xiàn)Runnable接口,要建立和Socket的聯(lián)系只要傳遞引用就可以了.而要執(zhí)行線程就必須重寫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類繼承了下來.并且通過構(gòu)造函數(shù)傳遞引用和客戶Socket建立了聯(lián)系,這樣每個(gè)線程就有了。一個(gè)通訊管道.同樣我們可以填寫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());

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

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 一个人免费日韩不卡视频| 国产成人高清亚洲| 99免费视频观看| 国产大片免费天天看| 亚洲精品av无码喷奶水糖心| 亚洲Av永久无码精品三区在线 | 精品亚洲视频在线观看| 好爽…又高潮了毛片免费看| 亚洲黄色免费电影| 久久午夜无码免费| 免费福利电影在线观看| 一级**爱片免费视频| 国产偷国产偷亚洲高清在线| 久久亚洲精品国产精品婷婷| 亚洲美女自拍视频| 亚洲视频在线观看一区| 久久亚洲精品成人| 亚洲AV无码精品无码麻豆| 国产精品亚洲精品日韩已满| 亚洲一区二区三区免费| 亚洲成AV人网址| 亚洲高清无码综合性爱视频| 国产免费av一区二区三区| 免费观看理论片毛片| 成人毛片免费网站| 白白国产永久免费视频| 成人黄软件网18免费下载成人黄18免费视频 | 亚洲国产精品嫩草影院| 亚洲综合久久精品无码色欲| 亚洲国产日产无码精品| 亚洲欧洲综合在线| 亚洲免费二区三区| 亚洲一区二区三区免费观看| 亚洲女人影院想要爱| 亚洲国产夜色在线观看| 亚洲专区一路线二| 亚洲中文字幕乱码熟女在线| 最新亚洲精品国偷自产在线| 亚洲综合色丁香婷婷六月图片 | 国产乱弄免费视频| 亚洲av区一区二区三|