java 網絡編程

這裏對於幾個基本的概念 URL  TCP  UDP  Socket 就不加說明了,這裏僅僅是記錄一些學習日誌備忘。

1:如何定義相對資源

     假設有如下兩個資源 :

     http://www.gamelan.com/pages/Gamelan.game.html
     http://www.gamelan.com/pages/Gamelan.net.html

我們可以通過URL 的構造函數來定義資源,可以通過一個 URL 對象來構造一個相當資源 URL(URL baseURL, String relativeURL)
,如下:
URL gamelan = new URL("http://www.gamelan.com/pages/");
URL gamelanGames = new URL(gamelan, "Gamelan.game.html");
URL gamelanNetwork = new URL(gamelan, "Gamelan.net.html");

對於有特殊字符的 url 地址 如:http://foo.com/hello world/   含有空格,
那麼這裏的地址是需要 encode 的(URL url = new URL("http://foo.com/hello%20world");),
或者是通過uri 來生產 url。如下:

    URI uri = new URI("http", "foo.com", "/hello world/", "");

    URL url = uri.toURL();


2: Socket 就是一個點對點的 tcp 連接,服務端通過一個 serversocket 來監聽本地的一個端口 sport1,如果有客戶端socket 連接上來,
serversocket  會重新生成一個 socket ,這個socket 連接本機的端口 sport1 和 客戶端socket 的端口。
客戶端連接服務器的時候,會連接服務器的監聽端口,而客戶端爲了能夠使得服務端能夠連接到客戶端,客戶端socket也會綁定一個本地端口,
這個端口一般來說都是系統分配的,而且服務端的生成的 socket 也會連接這個客戶端機器的系統分配的端口來建立連接。

這裏的 服務端 serversocket 在監聽到客戶端socket連接後 生成一個 服務端的連接客戶端的socket,
這裏針對每個連接生成的socket來產生一個線程處理業務的話,那麼這個 server 就可以支持多個客戶端了。

 

3: UDP 是採用數據包的形式發送。有很多的防火牆和 路由器配置有不接受UDP數據包,如果出現連接不上服務器,或者說服務端接收不到 UDP數據包,排查網絡的時候可以覈實一下這個網絡配置。

 

UDP 數據包是一個自尋址的數據包,他包含有要到達的目的地信息,其到達的時間和順序和內容是不被保證的。它不像TCP那樣是建立一個可靠的鏈路通道傳輸數據。

 

在java 中提供了幾個類來幫助你實現UDP傳輸的網絡實現:DatagramSocket, DatagramPacket, and MulticastSocket。

傳輸的數據包通過制定目的地地址來達到傳輸到目的地的目的。這裏的目的地地址可以是一個具體的接收者,也可以是一組接受者,這也就出現了單播、多播/組播、廣播的形式。

 

例如單播形式:

InetAddress address = InetAddress.getByName(args[0]);
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445);

 

例如多播形式:

InetAddress group = InetAddress.getByName("230.0.0.1");
DatagramPacket packet;
packet = new DatagramPacket(buf, buf.length, group, 4446);

 

 

那麼這裏的InetAddress  對象地址只是目的地地址不一樣,一個是單播地址,一個是多播地址。

這裏簡要說明下網絡地址形式。

 

A類地址:網絡地址佔前8位,主機地址佔後24位     0.0.0.0 ~ 127.255.255.255 
B類地址:網絡地址佔前16位,主機地址佔後16位    128.0.0.0 ~ 191.255.255.255
C類地址:網絡地址佔前24位,主機地址佔後8位     192.0.0.0 ~ 223.255.255.255
D類地址:屬多播地址     224.0.0.0 ~ 239.255.255.255
E類地址:保留今後使用   240.0.0.0 ~ 255.255.255.255

 

網絡ID、主機ID和子網掩碼:

網絡ID用來表示計算機屬於哪一個網絡,網絡ID相同的計算機不需要通過路由器連接就能夠直接通信,
我們把網絡ID相同的計算機組成一個網絡稱之爲本地網絡(網段);
網絡ID不相同的計算機之間通信必須通過路由器連接,我們把網絡ID不相同的計算機稱之爲遠程計算機。
當爲一臺計算機分配IP地址後,該計算機的IP地址哪部份表示網絡ID,哪部份表示主機ID,
並不由IP地址所屬的類來確定,而是由子網掩碼確定。子網確定一個IP地址屬於哪一個子網。
子網掩碼的格式是以連續的255後面跟連續的0表示,其中連續的255這部份表示網絡ID;連續0部份表示主機ID。
比如,子網掩碼255.255.0.0和255.255.255.0。
根據子網掩碼的格式可以發現,子網掩碼有0.0.0.0、255.0.0.0、255.255.0.0、255.255.255.0和255.255.255.255共五種。
採用這種格式的子網掩碼每個網絡中主機的數目相差至少爲256倍,不利於靈活根據企業需要分配IP地址。
比如,一個企業有2000臺計算機,用戶要麼爲其分配子網掩爲255.255.0.0,
那麼該網絡可包含65534臺計算機,將造成63534個IP地址的浪費;要麼用戶爲其分配8個255.255.255.0網絡,
那麼必須用路由器連接這個8個網絡,造成網絡管理和維護的負擔。
網絡ID是IP地址與子網掩碼進行與運算獲得,即將IP地址中表示主機ID的部份全部變爲0,
表示網絡ID的部份保持不變,則網絡ID的格式與IP地址相同都是32位的二進制數;主機ID就是表示主機ID的部份。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章