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

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

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

    posts - 66,  comments - 40,  trackbacks - 0

    Java Socket網絡編程初級入門


    事實上網絡編程簡單的理解就是兩臺計算機相互通訊數據而已,對于程序員而言,去掌握一種編程接口并使用一種編程模型相對就會顯得簡單的多了,Java SDK提供一些相對簡單的Api來完成這些工作。Socket就是其中之一,對于Java而言,這些Api存在與java.net 這個包里面,因此只要導入這個包就可以準備網絡編程了。

      網絡編程的基本模型就是客戶機到服務器模型,簡單的說就是兩個進程之間相互通訊,然后其中一個必須提供一個固定的位置,而另一個則只需要知道這個固定的位置。并去建立兩者之間的聯系,然后完成數據的通訊就可以了,這里提供固定位置的通常稱為服務器,而建立聯系的通常叫做客戶端,基于這個簡單的模型,就可以進入網絡編程啦。

      Java對這個模型的支持有很多種Api,而這里我只想介紹有關Socket的編程接口,對于Java而言已經簡化了Socket的編程接口。首先我們來討論有關提供固定位置的服務方是如何建立的。Java提供了ServerSocket來對其進行支持.事實上當你創建該類的一個實力對象并提供一個端口資源你就建立了一個固定位置可以讓其他計算機來訪問你,ServerSocket server=new ServerSocket(6789);這里稍微要注意的是端口的分配必須是唯一的。因為端口是為了唯一標識每臺計算機唯一服務的,另外端口號是從0~65535之間的,前1024個端口已經被Tcp/Ip 作為保留端口,因此你所分配的端口只能是1024個之后的。好了,我們有了固定位置.現在所需要的就是一根連接線了.該連接線由客戶方首先提出要求。因此Java同樣提供了一個Socket對象來對其進行支持,只要客戶方創建一個Socket的實例對象進行支持就可以了。Socket client
      =new Socket(InetAddress.getLocalHost(),5678);客戶機必須知道有關服務器的IP地址,對于著一點Java也提供了一個相關的類InetAddress 該對象的實例必須通過它的靜態方法來提供,它的靜態方法主要提供了得到本機IP 和通過名字或IP直接得到InetAddress的方法。

      上面的方法基本可以建立一條連線讓兩臺計算機相互交流了,可是數據是如何傳輸的呢?事實上I/O操作總是和網絡編程息息相關的。因為底層的網絡是繼續數據的,除非遠程調用,處理問題的核心在執行上,否則數據的交互還是依賴于IO操作的,所以你也必須導入java.io這個包.java的IO操作也不復雜,它提供了針對于字節流和Unicode的讀者和寫者,然后也提供了一個緩沖用于數據的讀寫。


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

      上面兩句就是建立緩沖并把原始的字節流轉變為Unicode可以操作,而原始的字節流來源于Socket的兩個方法,getInputStream()和getOutputStream()方,分別用來得到輸入和輸出,那么現在有了基本的模型和基本的操作工具,我們可以做一個簡單的Socket例程了.

      服務方:


      import java.io.*;
      import java.net.*;
      public class MyServer {
      public static void main(String[] args) throws IOException{
      ServerSocket server=new ServerSocket(5678);
      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();
      }
      }

      這個程序的主要目的在于服務器不斷接收客戶機所寫入的信息只到,客戶機發送"End"字符串就退出程序,并且服務器也會做出"Receive"為回應,告知客戶機已接收到消息。

      客戶機代碼:


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

      public class Client{
      static Socket server;

      public static void main(String[] args)throws Exception{
      server=new Socket(InetAddress.getLocalHost(),5678);
      BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream()));
      PrintWriter out=new PrintWriter(server.getOutputStream());
      BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));

      while(true){
       String str=wt.readLine();
       out.println(str);
       out.flush();
       if(str.equals("end")){
        break;
       }
       System.out.println(in.readLine());
      }
      server.close();
      }
      }

      客戶機代碼則是接受客戶鍵盤輸入,并把該信息輸出,然后輸出"End"用來做退出標識。

      這個程序只是簡單的兩臺計算機之間的通訊,如果是多個客戶同時訪問一個服務器呢?你可以試著再運行一個客戶端,結果是會拋出異常的。那么多個客戶端如何實現呢?

      其實,簡單的分析一下,就可以看出客戶和服務通訊的主要通道就是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就建立起來了。

    posted on 2006-11-13 16:09 happytian 閱讀(204) 評論(0)  編輯  收藏

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


    網站導航:
     
    <2006年11月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    Welcome here, my friend!

    常用鏈接

    留言簿(12)

    隨筆檔案(66)

    文章分類

    文章檔案(63)

    web

    最新隨筆

    搜索

    •  

    積分與排名

    • 積分 - 89266
    • 排名 - 647

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产精品视频| 日本片免费观看一区二区| 无码国模国产在线观看免费| 亚洲精品视频在线免费| 无码国产精品一区二区免费式芒果 | 成人免费看吃奶视频网站| 亚洲日产2021三区| 在线观看永久免费| 亚洲一区中文字幕在线观看| 69式国产真人免费视频| 亚洲乱亚洲乱妇24p| 日本免费人成视频播放| 美女免费精品高清毛片在线视| 无码专区一va亚洲v专区在线| 农村寡妇一级毛片免费看视频| 国产国拍精品亚洲AV片| 四虎影视无码永久免费| 亚洲第一福利视频| 国产在线jyzzjyzz免费麻豆| 亚洲男人天堂2018av| 又色又污又黄无遮挡的免费视| 一级特黄录像免费播放肥| 亚洲视频在线一区| 欧美最猛性xxxxx免费| 羞羞视频免费网站含羞草| 亚洲人成图片小说网站| 亚洲国产精品免费在线观看| 亚洲日本中文字幕天天更新| 国产亚洲精久久久久久无码AV | 91高清免费国产自产拍2021| 99久久婷婷国产综合亚洲| 深夜国产福利99亚洲视频| 久久免费国产视频| 亚洲人成网站色7799| 中文亚洲成a人片在线观看| 最近2019免费中文字幕视频三| 亚洲JLZZJLZZ少妇| 亚洲日韩精品射精日| 成人黄动漫画免费网站视频 | 亚洲一区二区三区在线观看蜜桃| 国产无遮挡色视频免费视频|