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

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

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

    Dict.CN 在線詞典, 英語學習, 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統計

    留言簿(23)

    積分與排名

    優秀學習網站

    友情連接

    閱讀排行榜

    評論排行榜

    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't 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就建立起來了。


    本文來自CSDN博客,轉載請標明出處:http:
    //blog.csdn.net/JaunLee/archive/2007/09/29/1805760.aspx

    posted on 2009-06-05 11:19 都市淘沙者 閱讀(35424) 評論(3)  編輯  收藏 所屬分類: 多線程并發編程

    評論

    # re: Java Socket網絡編程的經典例子(轉) 2015-06-24 17:25 sdf

    asdasdasdsad  回復  更多評論   

    # re: Java Socket網絡編程的經典例子(轉) 2015-10-13 13:06 減肥拉升

    5678是什么?這里的端口號是啥端口號  回復  更多評論   

    # re: Java Socket網絡編程的經典例子(轉) 2016-02-12 18:53 羊羊羊

    @減肥拉升
    5678是端口號,從1024以后隨便定義的,博主寫的非常好,很受益,謝謝  回復  更多評論   

    主站蜘蛛池模板: 一个人晚上在线观看的免费视频| 麻豆狠色伊人亚洲综合网站| 免费国产a理论片| 四虎在线视频免费观看| 亚洲一区二区三区丝袜| 四虎影院免费在线播放| 在线观看亚洲精品专区| 亚洲av区一区二区三| 九九综合VA免费看| 国产专区一va亚洲v天堂| a级毛片免费高清毛片视频| 亚洲爆乳无码一区二区三区| 午夜免费啪视频在线观看| 亚洲国产综合第一精品小说| 91嫩草国产在线观看免费| 亚洲精品国产suv一区88| 亚洲成av人片在线观看天堂无码| 人妻18毛片a级毛片免费看| 国产精品亚洲а∨无码播放| 四虎国产精品永久免费网址 | 亚洲一区影音先锋色资源| 91成人在线免费观看| 亚洲av乱码一区二区三区香蕉 | 免费国产作爱视频网站| 理论亚洲区美一区二区三区| 亚洲一区无码精品色| 久久国产精品免费观看| 亚洲一区精彩视频| 亚洲国产精品无码久久青草| 久操视频在线免费观看| 亚洲粉嫩美白在线| 亚洲免费观看视频| 在线观看成人免费视频不卡| 小说专区亚洲春色校园| 久久国产亚洲精品麻豆| 成人免费无码视频在线网站| 午夜成人无码福利免费视频| 久久亚洲日韩看片无码| 免费一级做a爰片久久毛片潮喷| 3344在线看片免费| 亚洲日日做天天做日日谢|