一篇文章瞭解Java之網路程式設計

網路程式設計的目的就是指直接或間接地透過網路協議與其他計算機進行通訊。

計算機網路形式多樣,內容繁雜。網路上的計算機要互相通訊,必須遵循一定的協議。目前使用最廣泛的網路協議是Internet上所使用的TCP/IP協議。

IP地址:具有全球唯一性,相對於internet,IP為邏輯地址。

IP地址分類:

1. A類地址

A類地址第1位元組為網路地址,其它3個位元組為主機地址。另外第1個位元組的最高位固定為0。

A類地址範圍:1。0。0。1到126。155。255。254。

A類地址中的私有地址和保留地址:

10。0。0。0到10。255。255。255是私有地址(所謂的私有地址就是在網際網路上不使用,而被用在區域網絡中的地址)。

127。0。0。0到127。255。255。255是保留地址,用做迴圈測試用的。

2. B類地址

B類地址第1位元組和第2位元組為網路地址,其它2個位元組為主機地址。另外第1個位元組的前兩位固定為10。

B類地址範圍:128。0。0。1到191。255。255。254。

B類地址的私有地址和保留地址

172。16。0。0到172。31。255。255是私有地址

169。254。0。0到169。254。255。255是保留地址。如果你的IP地址是自動獲取IP地址,而你在網路上又沒有找到可用的DHCP伺服器,這時你將會從169。254。0。0到169。254。255。255中臨得獲得一個IP地址。

3. C類地址

C類地址第1位元組、第2位元組和第3個位元組為網路地址,第4個個位元組為主機地址。另外第1個位元組的前三位固定為110。

C類地址範圍:192。0。0。1到223。255。255。254。

C類地址中的私有地址:

192。168。0。0到192。168。255。255是私有地址。

4. D類地址

D類地址不分網路地址和主機地址,它的第1個位元組的前四位固定為1110。

D類地址範圍:224。0。0。1到239。255。255。254

Mac地址:每個網絡卡專用地址,也是唯一的。

埠(port):OS中可以有65536(2^16)個埠,程序透過埠交換資料。連線的時候需要輸入IP也需要輸入埠資訊。

計算機通訊實際上的主機之間的程序通訊,程序的通訊就需要在埠進行聯絡。

192。168。0。23:21

協議:為了進行網路中的資料交換(通訊)而建立的規則、標準或約定。

不同層的協議是完全不同的。

網路層:定址、路由(指如何到達地址的過程)

傳輸層:埠連線

TCP模型:應用層/傳輸層/網路層/網路介面

埠是一種抽象的軟體結構,與協議相關:TCP23埠和UDT23埠為兩個不同的概念。

埠應該用1024以上的埠,以下的埠都已經設定功能。

TCP/IP模型

Application

(FTP,HTTP,TELNET,POP3,SMPT)

Transport

(TCP,UDP)

Network

(IP,ICMP,ARP,RARP)

Link

(Device driver,…。)

注:

IP:定址和路由

ARP(Address Resolution Protocol)地址解析協議:將IP地址轉換成Mac地址

RARP(Reflect Address Resolution Protocol)反相地址解析協議:與上相反

ICMP(Internet Control Message Protocol)檢測鏈路連線狀況。利用此協議的工具:ping , traceroute

二、TCP Socket

TCP是Tranfer Control Protocol的簡稱,是一種面向連線的保證可靠傳輸的協議。透過TCP協議傳輸,得到的是一個順序的無差錯的資料流。傳送方和接收方的成對的兩個socket之間必須建立連線,以便在TCP協議的基礎上進行通訊,當一個socket(通常都是server socket)等待建立連線時,另一個socket可以要求進行連線,一旦這兩個socket連線起來,它們就可以進行雙向資料傳輸,雙方都可以進行傳送或接收操作。

1) 伺服器分配一個埠號,伺服器使用accept()方法等待客戶端的訊號,訊號一到開啟socket連線,從socket中取得OutputStream和InputStream。

2) 客戶端提供主機地址和埠號使用socket埠建立連線,得到OutputStream和InputStream。

TCP/IP的傳輸層協議

1、 建立TCP伺服器端

建立一個TCP伺服器端程式的步驟:

1)。 建立一個ServerSocket

2)。 從ServerSocket接受客戶連線請求

3)。 建立一個服務執行緒處理新的連線

4)。 在服務執行緒中,從socket中獲得I/O流

5)。 對I/O流進行讀寫操作,完成與客戶的互動

6)。 關閉I/O流

7)。 關閉Socket

ServerSocket server = new ServerSocket(post)

Socket connection = server。accept();

ObjectInputStream put=new ObjectInputStream(connection。getInputStream());

ObjectOutputStreamo put=newObjectOutputStream(connection。getOutputStream());

處理輸入和輸出流;

關閉流和socket。

2、 建立TCP客戶端

建立一個TCP客戶端程式的步驟:

1)。建立Socket

2)。 獲得I/O流

3)。 對I/O流進行讀寫操作

4)。 關閉I/O流

5)。 關閉Socket

Socket connection = new Socket(127。0。0。1, 7777);ObjectInputStream input=new ObjectInputStream(connection。getInputStream());ObjectOutputStream utput=new ObjectOutputStream(connection。getOutputStream());複製程式碼

處理輸入和輸出流;

關閉流和socket。

三、 建立UDP連線

UDP是User Datagram Protocol的簡稱,是一種無連線的協議,每個資料報都是一個獨立的資訊,包括完整的源地址或目的地址,它在網路上以任何可能的路徑傳往目的地,因此能否到達目的地,到達目的地的時間以及內容的正確性都是不能被保證的。

比較:TCP在網路通訊上有極強的生命力,例如遠端連線(Telnet)和檔案傳輸(FTP)都需要不定長度的資料被可靠地傳輸;既然有了保證可靠傳輸的TCP協議,為什麼還要非可靠傳輸的UDP協議呢?主要的原因有兩個。一是可靠的傳輸是要付出代價的,對資料內容正確性的檢驗必然佔用計算機的處理時間和網路的頻寬,因此TCP傳輸的效率不如UDP高。二是在許多應用中並不需要保證嚴格的傳輸可靠性,比如影片會議系統,並不要求音訊影片資料絕對的正確,只要保證連貫性就可以了,這種情況下顯然使用UDP會更合理一些。

如:www。tarena。com。cn:80/teacher/zhu…

協議名://機器名+埠號+檔名

2 。 URL類的常見方法

一個URL物件生成後,其屬性是不能被改變的,但是我們可以透過類URL所提供的方法來獲取這些屬性:

public String getProtocol() 獲取該URL的協議名。

public String getHost() 獲取該URL的主機名。

public int getPort() 獲取該URL的埠號,如果沒有設定埠,返回-1。

public String getFile() 獲取該URL的檔名。

public String getRef() 獲取該URL在檔案中的相對位置。

public String getQuery() 獲取該URL的查詢資訊。

public String getPath() 獲取該URL的路徑

public String getAuthority() 獲取該URL的許可權資訊

public String getUserInfo() 獲得使用者的資訊

public String getRef() 獲得該URL的錨

例子,將tarena網站首頁複製到本機上。

import java。net。*;import java。io。*;import java。util。*;public class TestURL{ public static void main(String[] arg){ System。out。println(“http://www。tarena。com。cn:80/index。htm===>”); //System。out。println(getWebContent()); writeWebFile(getWebContent()); } public static String getWebContent(){ URL url = null; HttpURLConnection uc = null; BufferedReader br = null; final int buffLen = 2048; byte[] buff = new byte[buffLen]; String message = “”; String tmp = “”; int len = -1; String urlStr = “http://www。tarena。com。cn:80/index。htm”; try{ url = new URL(urlStr); //連線到web資源 System。out。println(“before openConnection ====>”+new Date()); uc = (HttpURLConnection)url。openConnection(); System。out。println(“end openConnection ====>”+new Date()); br = new BufferedReader( new InputStreamReader(uc。getInputStream())); System。out。println(“end getINputStream() ====>”+new Date()); while( ( tmp = br。readLine())!=null){ message += tmp; } System。out。println(“end set message ====>”+new Date()); }catch(Exception e){e。printStackTrace();System。exit(1);} finally{ if(br!=null){ try{ br。close(); }catch(Exception ioe){ioe。printStackTrace();} } } return message; } public static void writeWebFile(String content){ FileWriter fw = null; try{ fw = new FileWriter(“index。htm”); fw。write(content,0,content。length()); }catch(Exception e){ e。printStackTrace(); }finally{ if(fw!=null){ try{ fw。close(); }catch(Exception e){} } } }}複製程式碼

四、UDP socket

這種資訊傳輸方式相當於傳真,資訊打包,在接受端準備紙。

特點:

基於UDP無連線協議

不保證訊息的可靠傳輸

它們由Java技術中的DatagramSocket和DatagramPacket類支援

DatagramSocket(郵遞員):對應資料報的Socket概念,不需要建立兩個socket,不可使用輸入輸出流。

DatagramPacket(信件):資料包,是UDP下進行傳輸資料的單位,資料存放在位元組陣列中,其中包括了目標地址和埠以及傳送的資訊(所以不用建立點對點的連線)。

DatagramPacket的分類:

用於接收:DatagramPacket(byte[] buf,int length)

DatagramPacket(byte[] buf,int offset,int length)

用於傳送:DatagramPacket(byte[] buf,int length, InetAddress address,int port )

DatagramPacket(byte[] buf,int offset,int length,InetAddress address,int port)

注:InetAddress類網址用於封裝IP地址

沒有構造方法,透過

InetAddress。getByAddress(byte[] addr):InetAddress

InetAddress。getByName(String host):InetAddress

等。

1、建立UDP 傳送端

建立一個UDP的傳送方的程式的步驟:

1)。 建立一個DatagramPacket,其中包含傳送的資料和接收方的IP地址和埠

號。

2)。 建立一個DatagramSocket,其中包含了傳送方的IP地址和埠號。

3)。 傳送資料

4)。 關閉DatagramSocket

byte[] buf = new byte[1024];DatagramSocket datagramSocket = new DatagramSocket(13);// set portDatagramPacket intputPacket = new DatagramPacket (buf,buf。length);datagramSocket。receive(inputPacket);DatagramPacket outputPacket = new DatagramPacket (buf,buf。length,inetAddress,port);datagramSocket。send(outputPacket);複製程式碼

沒建立流所以不用斷開。

2、 建立UDP 接受端

建立一個UDP的接收方的程式的步驟:

1)。 建立一個DatagramPacket,用於儲存傳送方傳送的資料及傳送方的IP地址和埠號。

2)。 建立一個DatagramSocket,其中指定了接收方的IP地址和埠號。

3)。 接收資料

4)。 關閉DatagramSocket

byte[] buf = new byte[1024];DatagramSocket datagramSocket = new DatagramSocket();//不用設埠,因為傳送的包中埠DatagramPacket outputPacket=new DatagramPacket(Buf, buf。length, serverAddress, serverPort);DatagramPacket inputPacket=new DatagramPacket(buf, buf。length);datagramSocket。receive(inputPacket);複製程式碼

URL類:可直接送出或讀入網路上的資料。

Socket類:可以想象為兩個不同主機的程式透過網路的通訊通道。

Datagram類:它把資料的目的記錄放在資料包中,然後直接放到網路上。

InetAddress類:用來儲存internet地址的類(ip地址,域名)。

連結:https://juejin。cn/post/7026870482116804644