網(wǎng)絡(luò)編程
網(wǎng)絡(luò)編程介紹
什么是網(wǎng)絡(luò)編程?
網(wǎng)絡(luò)編程可以讓程序與網(wǎng)絡(luò)上的其他設(shè)備中的程序進(jìn)行數(shù)據(jù)交互。
網(wǎng)絡(luò)編程基本模式:
常見的通信模式有如下2種形式:Client-Server(CS: 客戶端與服務(wù)器模式) 、 Browser/Server(BS: 瀏覽器與服務(wù)器模式)
Client-Server(CS)模式
Browser/Server(BS)模式
網(wǎng)絡(luò)通信三要素
實(shí)現(xiàn)網(wǎng)絡(luò)編程關(guān)鍵的三要素:
IP地址:設(shè)備在網(wǎng)絡(luò)中的地址,是唯一的標(biāo)識(shí)。
端口:應(yīng)用程序在設(shè)備中唯一的標(biāo)識(shí)。
協(xié)議: 數(shù)據(jù)在網(wǎng)絡(luò)中傳輸?shù)囊?guī)則,常見的協(xié)議有UDP協(xié)議和TCP協(xié)議。
要素一: IP地址
IP地址基本介紹
IP(Internet Protocol):全稱”互聯(lián)網(wǎng)協(xié)議地址”,是分配給上網(wǎng)設(shè)備的唯一標(biāo)志。
常見的IP分類為:IPv4和IPv6
IPV4
IPV4: 32位(四個(gè)字節(jié))
IPV4每個(gè)字節(jié)表示一個(gè)整數(shù), 每個(gè)整數(shù)之間使用逗號(hào)隔開
IPV6
IPv6:128位(16個(gè)字節(jié)),由于IPV4不夠用, 所以出現(xiàn)了IPV6, IPV6號(hào)稱可以為地球每一粒沙子編號(hào)。
IPv6分成8個(gè)整數(shù),每個(gè)整數(shù)用四個(gè)十六進(jìn)制位表示, 數(shù)之間用冒號(hào)(:)分開。
IP地址形式:
公網(wǎng)地址、和私有地址(局域網(wǎng)使用)。
192.168. 開頭的就是常見的局域網(wǎng)地址,范圍即為192.168.0.0–192.168.255.255,專門為組織機(jī)構(gòu)內(nèi)部使用。
IP常用命令:
ipconfig:查看本機(jī)IP地址
ping IP地址:檢查網(wǎng)絡(luò)是否連通
特殊的IP地址:
本機(jī)IP: 127.0.0.1或者localhost:稱為回送地址也可稱本地回環(huán)地址,只會(huì)尋找當(dāng)前所在本機(jī)。
IP地址的操作類
IP地址操作類InetAddress的使用
此類表示Internet協(xié)議(IP)地址。
InetAddress API如下:
名稱 | 說明 |
---|---|
static InetAddress getLocalHost() | 返回本主機(jī)的地址對(duì)象 |
static InetAddress getByName(String host) | 得到指定主機(jī)的IP地址對(duì)象,參數(shù)是域名或者IP地址 |
getHostName() | 獲取此IP地址的主機(jī)名 |
getHostAddress() | 返回IP地址字符串 |
isReachable(int timeout) | 在指定毫秒內(nèi)連通該IP地址對(duì)應(yīng)的主機(jī),連通返回true |
前兩個(gè)靜態(tài)方法用于獲取地址對(duì)象
public static void main(String[] args) throws Exception {
// 返回本機(jī)地址對(duì)象
InetAddress ip1 = InetAddress.getLocalHost();
System.out.println(ip1); // chenyqdeMacBook-Pro.local/127.0.0.1
// 根據(jù)域名或IP地址返回地址對(duì)象
InetAddress ip2 = InetAddress.getByName("www.baidu.com");
System.out.println(ip2); // www.baidu.com/183.232.231.172
}
獲取地址對(duì)象后, 可以根據(jù)地址對(duì)象獲取主機(jī)名、地址字符串、是否連通等等。
public static void main(String[] args) throws Exception {
// 返回本機(jī)地址對(duì)象
InetAddress ip1 = InetAddress.getLocalHost();
System.out.println(ip1); // chenyqdeMacBook-Pro.local/127.0.0.1
// 主機(jī)名
System.out.println(ip1.getHostName()); // chenyqdeMacBook-Pro.local
// 主機(jī)地址
System.out.println(ip1.getHostAddress()); // 127.0.0.1
// 三秒內(nèi)是否連通
System.out.println(ip1.isReachable(3000)); // true
}
要素二: 端口號(hào)
端口號(hào):
端口號(hào):標(biāo)識(shí)正在計(jì)算機(jī)設(shè)備上運(yùn)行的進(jìn)程(程序),被規(guī)定為一個(gè) 16 位的二進(jìn)制,范圍是 0~65535。
例如我們將IP地址看成是酒店名稱, 那么端口號(hào)就是房間號(hào); 有IP地址有端口號(hào)我們才可以準(zhǔn)確的找到運(yùn)行的程序
端口類型:
周知端口:0~1023,被預(yù)先定義的知名應(yīng)用占用(如:HTTP占用 80,F(xiàn)TP占用21)
注冊(cè)端口:1024~49151, 分配給用戶進(jìn)程或某些應(yīng)用程序。(如:Tomcat占 用8080,MySQL占用3306)
動(dòng)態(tài)端口:49152到65535,之所以稱為動(dòng)態(tài)端口,是因?yàn)樗话悴还潭ǚ峙淠撤N進(jìn)程,而是動(dòng)態(tài)分配。
注意:我們自己開發(fā)的程序選擇注冊(cè)端口,且一個(gè)設(shè)備中不能出現(xiàn)兩個(gè)程序的端口號(hào)一樣,否則出錯(cuò)
要素三: 協(xié)議
通信協(xié)議:
連接和通信數(shù)據(jù)的規(guī)則被稱為網(wǎng)絡(luò)通信協(xié)議
網(wǎng)絡(luò)通信協(xié)議有兩套參考模型:
OSI參考模型:世界互聯(lián)協(xié)議標(biāo)準(zhǔn),全球通信規(guī)范,由于此模型過于理想化,未能在因特網(wǎng)上進(jìn)行廣泛推廣。
TCP/IP參考模型(或TCP/IP協(xié)議):事實(shí)上的國際標(biāo)準(zhǔn)。
OSI參考模型 | TCP/IP參考模型 | 各層對(duì)應(yīng) | 面向操作 |
---|---|---|---|
應(yīng)用層 | 應(yīng)用層 | HTTP、FTP、DNS、SMTP… | 應(yīng)用程序需要關(guān)注的:瀏覽器,郵箱。程序員一般在這一層開發(fā) |
表示層 | |||
會(huì)話層 | |||
傳輸層 | 傳輸層 | TCP、UDP… | 選擇使用的TCP , UDP協(xié)議 |
網(wǎng)絡(luò)層 | 網(wǎng)絡(luò)層 | IP、ICMP… | 封裝源和目標(biāo)IP,進(jìn)行路徑選擇 |
數(shù)據(jù)鏈路層 | 數(shù)據(jù)鏈路層+物理 | 物理尋址、比特流… | 物理設(shè)備中傳輸 |
物理層 |
傳輸層的兩個(gè)常見的協(xié)議:
TCP(Transmission Control Protocol) :傳輸控制協(xié)議
UDP(User Datagram Protocol):用戶數(shù)據(jù)報(bào)協(xié)議
TCP協(xié)議
TCP協(xié)議特點(diǎn):
使用TCP協(xié)議,必須雙方先建立連接,它是一種面向連接的可靠通信協(xié)議。
傳輸前,采用“三次握手”方式建立連接,所以是可靠的 。
在連接中可進(jìn)行大數(shù)據(jù)量的傳輸 。
連接、發(fā)送數(shù)據(jù)都需要確認(rèn),且傳輸完畢后,還需釋放已建立的連接,通信效率較低。
TCP協(xié)議通信場(chǎng)景:
對(duì)信息安全要求較高的場(chǎng)景,例如:文件下載、金融等數(shù)據(jù)通信
TCP會(huì)進(jìn)行三次握手確立連接:
第一次握手: 客戶端發(fā)送網(wǎng)絡(luò)包,服務(wù)端收到了。
- 服務(wù)器端得出結(jié)論: 客戶端發(fā)送能力正常, 服務(wù)端接收能力正常
第二次握手: 服務(wù)端發(fā)包,客戶端收到了。
- 客戶端得出結(jié)論: 服務(wù)端的發(fā)送能力和接收能力正常, 客戶端的發(fā)送能力和接收能力正常;
- 但是此時(shí)服務(wù)端并不知道客戶端的接收能力是否正常, 所以就會(huì)進(jìn)行第三次握手
第三次握手: 客戶端發(fā)包,服務(wù)端收到了。
- 服務(wù)端得出結(jié)論: 客戶端的接收、發(fā)送能力正常,服務(wù)器自己的發(fā)送、接收能力也正常。
TCP會(huì)進(jìn)行四次揮手?jǐn)嚅_連接:
第一次揮手: 客戶端向服務(wù)端發(fā)送一個(gè)數(shù)據(jù)包
- 告訴服務(wù)端:我要跟你斷開連接了,不會(huì)再給你發(fā)數(shù)據(jù)了;
第二次揮手: 服務(wù)端收到數(shù)據(jù)包后, 向客戶端發(fā)送一個(gè)數(shù)據(jù)包
- 服務(wù)端告訴客戶端:我知道你要斷開了,但是我還有數(shù)據(jù)沒有發(fā)送完,等發(fā)送完了所有的數(shù)據(jù)就進(jìn)行第三次揮手
第三次揮手: 服務(wù)端向客戶端發(fā)送一個(gè)數(shù)據(jù)包
- 這是服務(wù)端告訴客戶端:我的數(shù)據(jù)也發(fā)送完了,不再給你發(fā)數(shù)據(jù)了
第四次揮手: 客戶端收到數(shù)據(jù)包之后,一樣發(fā)送一個(gè) ACK 報(bào)文作為應(yīng)答; 并經(jīng)過一段時(shí)間發(fā)送確認(rèn)包
- 至此斷開連接, 四次揮手結(jié)束
UDP協(xié)議
UDP協(xié)議:
UDP是一種無連接、不可靠傳輸?shù)膮f(xié)議。
將數(shù)據(jù)源IP、目的地IP和端口封裝成數(shù)據(jù)包,不需要建立連接
每個(gè)數(shù)據(jù)包的大小限制在64KB內(nèi)
發(fā)送不管對(duì)方是否準(zhǔn)備好,接收方收到也不確認(rèn),故是不可靠的
可以廣播發(fā)送 ,發(fā)送數(shù)據(jù)結(jié)束時(shí)無需釋放資源,開銷小,速度快。
UDP協(xié)議通信場(chǎng)景:文章來源:http://www.zghlxwxcb.cn/news/detail-782990.html
語言通話, 視頻通話文章來源地址http://www.zghlxwxcb.cn/news/detail-782990.html
到了這里,關(guān)于Java網(wǎng)絡(luò)編程 - 網(wǎng)絡(luò)編程介紹 - 網(wǎng)絡(luò)通信三要素的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!