1. 程式人生 > >Java基礎學習(六) 網絡編程簡介

Java基礎學習(六) 網絡編程簡介

exc 個數 intern 時間 能夠 兩臺 接受 void connect

基礎知識:
1、osi分層模型和TCP/IP分層模型對應關系

技術分享圖片

2、七層模型與協議的對應關系
網絡層 ------------ IP(網絡之間的互聯協議)
傳輸層 ------------ TCP(傳輸控制協議)、UDP(用戶數據報協議)
應用層 ------------ Telnet(Internet遠程登錄服務的標準協議和主要方式)、FTP(文本傳輸協議)、HTTP(超文本傳送協議)

3、IP地址和端口號
1、ip地址用於唯一標示網絡中的一個通信實體,這個通信實體可以是一臺主機,可以是一臺打印機,或者是路由器的某一個端口。而在基於IP協議網絡中傳輸的數據包,必須使用IP地址來進行標示。
2、ip地址唯一標示了通信實體,但是一個通信實體可以有多個通信程序同時提供網絡服務。這個時候就要通過端口來區分開具體的通信程序。一個通信實體上不能有兩個通信程序使用同一個端口號。

4、TCP和UDP
1、TCP是一種面向連接的保證可靠傳輸的協議。通過TCP協議傳輸,得到的是一個順序的無差錯的數據流。它能夠提供兩臺計算機之間的可靠的數據流,HTTP、FTP、Telnet等應 用都需要這種可靠的通信通道。
2、UDP是一種無連接的協議,每個數據報都是一個獨立的信息,包括完整的源地址或目的地址,它在網絡上以任何可能的路徑傳送目的地,至於能夠達到目的地,達到目的地的時 間以及內容的正確性都是不能保證的。

TCP和UDP差異:
1、可靠的傳輸是要付出代價的,對數據內容的正確性的檢驗必然會占用計算機處理時間和網絡帶寬。因此TCP的傳輸效率不如UDP高。
2、許多應用中並不需要保證嚴格的傳輸可靠性,比如視頻會議系統,並不要求視頻音頻數據絕對正確,只要能夠連貫就可以了。所以在這些場景下,使用UDP更合適些。

5、URL
1、URL對象代表統一資源定位器,是指向互聯網“資源”的指針。它是用協議名、主機、端口和資源組成,即滿足如下格式:
protocol://host:port/resourceName
http://www.crazyit.org/index.php
2、通過URL對象的一些方法可以訪問該URL對應的資源:
String getFile():獲取該URL的資源名
String getHost():獲取主機名
String getPath():獲取路徑部分
int getPort():獲取端口號
public static void main(String[] args) throws IOException
{
URL url = new URL("https://i.cnblogs.com/EditPosts.aspx?opt=1");
String file = url.getFile();
String host = url.getHost();
int port = url.getPort();
String query = url.getQuery();
String protocol = url.getProtocol();
}
URL最重要的兩個方法:openConnection()、openStream()
public static void main(String[] args) throws IOException
{
URL url = new URL("http://www.baidu.com");
URLConnection connection = url.openConnection();
InputStream is = connection.getInputStream();
OutputStream os = new FileOutputStream("c:/data.txt");
byte[] buffer = new byte[1024];
int flag = 0;
while (-1 != (flag = is.read(buffer, 0, buffer.length)))
{
os.write(buffer, 0, flag);
}
os.close();
is.close();
}

1、代碼第4行openConnection()該方法用於返回URLConnection對象,表示到URL所引用的遠程連接。
2、代碼第5行getInputStream方法,用於返回從此打開的連接讀取的輸入流。
3、後面的代碼就是我們已經很熟悉的從輸入流中讀到數據,再通過輸出流寫入文件。
4、執行的結果就是我們通過瀏覽器訪問http://www.baidu.com,百度服務器返回的內容。
5、這裏是文本文件,我們將後綴修改為html,然後用瀏覽器訪問,這樣看起來更直觀:

6、InetAddress
JAVA提供了InetAddress類來代表IP地址。

public static void main(String[] args) throws IOException
{
InetAddress address = InetAddress.getLocalHost();
System.out.println(address);
address = InetAddress.getByName("www.baidu.com");
System.out.println(address);

}
1 WINDOWS-EC813QQ/192.168.88.1
2 www.baidu.com/115.239.211.112

7、Socket網絡通信
Socket又稱套接字,是連接運行在網絡上兩個程序間的雙向通訊的端點。

使用Socket進行網絡通信的過程
服務端:服務器程序將一個套接字綁定到一個特定的端口,並通過此套接字等待和監聽客戶端的連接請求。
客戶端:客戶端程序根據你服務器所在的主機名和端口號發出連接請求。
兩者之間的通信是通過Socket完成的,我們可以認為Socket是兩個城市之間的交通工具,有了它,就可以在兩個城市之間穿梭了。

主機A的應用程序和主機B的應用程序通信,必須通過Socket建立連接,而建立Socket必須由底層的TCP/IP協議來建立TCP連接。建立TCP連接需要底層IP協議來尋址網絡中的主機。IP地址只能幫助我們找到目標主機,但是一個主機上面有多個應用程序,如何才能找到我們需要的應用程序,這個時候就可以通過端口號來指定了。

簡易服務端、客戶端模擬,樣例:
服務器端:
public class ServerTest {
public static void main(String[] args) throws IOException {
//創建一個ServerSocket,用於監聽客戶端Socket連接請求
ServerSocket ss = new ServerSocket(9999);
System.out.println("server start");
//采用循環方式監聽客戶端的請求
while (true) { //偵聽並接受到此套接字的連接。此方法在連接傳入之前一直阻塞。
Socket socket = ss.accept();
//獲取客戶端的信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String str = br.readLine();
System.out.println(str);
//向客戶端發送信息
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.print("服務端 -> 客戶端");
ps.close();
os.close();
br.close();
is.close();
socket.close();
}
}
}

客戶端:
public class Client{
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 9999);
//向服務器發信息
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println("客戶端->服務端");
//讀取服務器發送的信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String str = br.readLine();
System.out.println(str);
br.close();
is.close();
socket.close();
}

}

Java基礎學習(六) 網絡編程簡介