一.介紹
網(wǎng)絡(luò)通信協(xié)議是一種網(wǎng)絡(luò)通用語言堕仔,為連接不同操作系統(tǒng)和不同硬件體系結(jié)構(gòu)的互聯(lián)網(wǎng)絡(luò)引提供通信支持,是一種網(wǎng)絡(luò)通用語言。
例如绍豁,網(wǎng)絡(luò)中一個微機用戶和一個大型主機的操作員進行通信,由于這兩個數(shù)據(jù)終端所用字符集不同牙捉,因此操作員所輸入的命令彼此不認識竹揍。為了能進行通信,規(guī)定每個終端都要將各自字符集中的字符先變換為標準字符集的字符后邪铲,才進入網(wǎng)絡(luò)傳送芬位,到達目的終端之后,再變換為該終端字符集的字符带到。因此昧碉,網(wǎng)絡(luò)通信協(xié)議也可以理解為網(wǎng)絡(luò)上各臺計算機之間進行交流的一種語言。
二.知識點介紹
1揽惹、網(wǎng)絡(luò)通信協(xié)議
2晌纫、網(wǎng)絡(luò)編程三要素
3、IP地址和端口號
三.上課視頻對應(yīng)說明文檔
在Internet上的主機一般運行了多個服務(wù)軟件永丝,同時提供幾種服務(wù)锹漱。每種服務(wù)都打開一個Socket,并綁定到一個端口上慕嚷,不同的端口對應(yīng)于不同的服務(wù)哥牍。
Socket就是為網(wǎng)絡(luò)編程提供的一種機制,又叫套接字編程喝检。Socket需要理解以下幾點內(nèi)容:
(1)通信的兩端都有Socket嗅辣。
(2)網(wǎng)絡(luò)通信其實就是Socket間的通信。
(3)數(shù)據(jù)在兩個Socket間通過IO傳輸挠说。
Socket編程一般使用TCP與UDP兩種協(xié)議澡谭,這里主要介紹TCP。
在介紹TCP/IP結(jié)構(gòu)時损俭,提到傳輸層的兩個重要的高級協(xié)議蛙奖,分別是UDP和TCP潘酗,其中UDP是User Datagram Protocol的簡稱,稱為用戶數(shù)據(jù)報協(xié)議雁仲,TCP是Transmission Control Protocol的簡稱仔夺,稱為傳輸控制協(xié)議。
1攒砖、網(wǎng)絡(luò)通信協(xié)議
通過計算機網(wǎng)絡(luò)可以使多臺計算機實現(xiàn)連接缸兔,位于同一個網(wǎng)絡(luò)中的計算機在進行連接和通信時需要遵守一定的規(guī)則,這就好比在道路中行駛的汽車一定要遵守交通規(guī)則一樣吹艇。在計算機網(wǎng)絡(luò)中惰蜜,這些連接和通信的規(guī)則被稱為網(wǎng)絡(luò)通信協(xié)議,它對數(shù)據(jù)的傳輸格式受神、傳輸速率蝎抽、傳輸步驟等做了統(tǒng)一規(guī)定,通信雙方必須同時遵守才能完成數(shù)據(jù)交換路克。
網(wǎng)絡(luò)通信協(xié)議有很多種樟结,目前應(yīng)用最廣泛的是TCP/IP協(xié)議(Transmission Control Protocal/Internet Protocal傳輸控制協(xié)議/英特網(wǎng)互聯(lián)協(xié)議),它是一個包括TCP協(xié)議和IP協(xié)議精算,UDP(User DatagramProtocal)協(xié)議和其它一些協(xié)議的協(xié)議組瓢宦,在學(xué)習(xí)具體協(xié)議之前首先了解一下TCP/IP協(xié)議組的層次結(jié)構(gòu)。
在進行數(shù)據(jù)傳輸時灰羽,要求發(fā)送的數(shù)據(jù)與收到的數(shù)據(jù)完全一樣驮履,這時,就需要在原有的數(shù)據(jù)上添加很多信息廉嚼,以保證數(shù)據(jù)在傳輸過程中數(shù)據(jù)格式完全一致玫镐。TCP/IP協(xié)議的層次結(jié)構(gòu)比較簡單,共分為四層怠噪,如圖所示恐似。
圖1-1 TCP/IP網(wǎng)絡(luò)模型
上圖中,TCP/IP協(xié)議中的四層分別是應(yīng)用層傍念、傳輸層矫夷、網(wǎng)絡(luò)層和鏈路層,每層分別負責(zé)不同的通信功能憋槐,接下來針對這四層進行詳細地講解双藕。
(1)鏈路層:鏈路層是用于定義物理傳輸通道,通常是對某些網(wǎng)絡(luò)連接設(shè)備的驅(qū)動協(xié)議阳仔,例如針對光纖忧陪、網(wǎng)線提供的驅(qū)動。
(2)網(wǎng)絡(luò)層:網(wǎng)絡(luò)層是整個TCP/IP協(xié)議的核心,它主要用于將傳輸?shù)臄?shù)據(jù)進行分組嘶摊,將分組數(shù)據(jù)發(fā)送到目標計算機或者網(wǎng)絡(luò)延蟹。
(3)運輸層:主要使網(wǎng)絡(luò)程序進行通信,在進行網(wǎng)絡(luò)通信時更卒,可以采用TCP協(xié)議等孵,也可以采用UDP協(xié)議稚照。
(4)應(yīng)用層:主要負責(zé)應(yīng)用程序的協(xié)議蹂空,例如HTTP協(xié)議、FTP協(xié)議等果录。
2上枕、網(wǎng)絡(luò)編程三要素:
分別為IP,端口弱恒,協(xié)議
其他:
ipconfig用于DOS獲取計算機IP設(shè)置
ping用于判斷兩臺計算機連接是否通暢
127.0.0.1與localhost類似辨萍,均代表本機地址
xxx.xxx.xxx.255 廣播地址,即該網(wǎng)段下所有用戶均可以被通知到
3返弹、IP地址和端口號
要想使網(wǎng)絡(luò)中的計算機能夠進行通信锈玉,必須為每臺計算機指定一個標識號,通過這個標識號來指定接受數(shù)據(jù)的計算機或者發(fā)送數(shù)據(jù)的計算機义起。
在TCP/IP協(xié)議中拉背,這個標識號就是IP地址,它可以唯一標識一臺計算機默终,目前椅棺,IP地址廣泛使用的版本是IPv4,它是由4個字節(jié)大小的二進制數(shù)來表示齐蔽,如:00001010000000000000000000000001两疚。由于二進制形式表示的IP地址非常不便記憶和處理,因此通常會將IP地址寫成十進制的形式含滴,每個字節(jié)用一個十進制數(shù)字(0-255)表示诱渤,數(shù)字間用符號“.”分開,如 “192.168.1.100”谈况。
隨著計算機網(wǎng)絡(luò)規(guī)模的不斷擴大源哩,對IP地址的需求也越來越多,IPV4這種用4個字節(jié)表示的IP地址面臨枯竭鸦做,因此IPv6 便應(yīng)運而生了励烦,IPv6使用16個字節(jié)表示IP地址,它所擁有的地址容量約是IPv4的8×1028倍泼诱,達到2128個(算上全零的)坛掠,這樣就解決了網(wǎng)絡(luò)地址資源數(shù)量不夠的問題。
通過IP地址可以連接到指定計算機,但如果想訪問目標計算機中的某個應(yīng)用程序屉栓,還需要指定端口號舷蒲。在計算機中,不同的應(yīng)用程序是通過端口號區(qū)分的友多。端口號是用兩個字節(jié)(16位的二進制數(shù))表示的牲平,它的取值范圍是0~65535,其中域滥,0~1023之間的端口號用于一些知名的網(wǎng)絡(luò)服務(wù)和應(yīng)用纵柿,用戶的普通應(yīng)用程序需要使用1024以上的端口號,從而避免端口號被另外一個應(yīng)用或服務(wù)所占用启绰。
接下來通過一個圖例來描述IP地址和端口號的作用昂儒,如下圖所示。
從上圖中可以清楚地看到委可,位于網(wǎng)絡(luò)中一臺計算機可以通過IP地址去訪問另一臺計算機渊跋,并通過端口號訪問目標計算機中的某個應(yīng)用程序。
4着倾、InetAddress
了解了IP地址的作用拾酝,我們看學(xué)習(xí)下JDK中提供了一個InetAdderss類,該類用于封裝一個IP地址卡者,并提供了一系列與IP地址相關(guān)的方法蒿囤,下表中列出了InetAddress類的一些常用方法。
(1)static InetAddress getByName(String host):在給定主機名的情況下確定主機的IP地址虎眨。
(2)static InetAddress getLocalHost():返回本地主機蟋软。
(3)String getHostName():獲取此IP地址的主機名。
(4)String getHostAddress():返回IP地址字符串(以文本表現(xiàn)形式)
上述方法中嗽桩,列舉了InetAddress的四個常用方法岳守。其中,前兩個方法用于獲得該類的實例對象碌冶,第一個方法用于獲得表示指定主機的InetAddress對象湿痢,第二個方法用于獲得表示本地的InetAddress對象。通過InetAddress對象便可獲取指定主機名扑庞,IP地址等譬重,接下來通過一個案例來演示InetAddress的常用方法.
代碼示例:
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
/*
*? 描述IP的類 InetAddress.? ip對象.?
*/
public class Demo2 {
public static void main(String[] args) throws IOException {
// fun1();
// 獲取別人的ip對象
InetAddress duiFang_IP = InetAddress.getByName("192.168.107.32");
String hostAddress = duiFang_IP.getHostAddress();
System.out.println(hostAddress); // 192.168.107.32
String hostName = duiFang_IP.getHostName();
System.out.println(hostName); // PC-201606060816
}
private static void fun1() throws UnknownHostException {
// 獲取本地主機ip對象
InetAddress local_IP = InetAddress.getLocalHost();
String hostAddress = local_IP.getHostAddress(); // 獲取本地ip地址.
System.out.println("ip:" + hostAddress); // 192.168.107.81
String hostName = local_IP.getHostName(); // 獲取本地主機名
System.out.println(hostName); // youcai-PC
}
}