??網(wǎng)絡(luò)編程基礎(chǔ)
??為什么需要網(wǎng)絡(luò)編程?
用戶在瀏覽器中,打開在線視頻網(wǎng)站,如騰訊看視頻,實(shí)質(zhì)是通過網(wǎng)絡(luò),獲取到網(wǎng)絡(luò)上的一個視頻資源。
與本地打開視頻文件類似,只是視頻文件這個資源的來源是網(wǎng)絡(luò)。
相比本地資源來說,網(wǎng)絡(luò)提供了更為豐富的網(wǎng)絡(luò)資源:
所謂的網(wǎng)絡(luò)資源,其實(shí)就是在網(wǎng)絡(luò)中可以獲取的各種數(shù)據(jù)資源。
而所有的網(wǎng)絡(luò)資源,都是通過網(wǎng)絡(luò)編程來進(jìn)行數(shù)據(jù)傳輸?shù)摹?/p>
??什么是網(wǎng)絡(luò)編程?
網(wǎng)絡(luò)編程,指網(wǎng)絡(luò)上的主機(jī),通過不同的進(jìn)程,以編程的方式實(shí)現(xiàn)網(wǎng)絡(luò)通信(或稱為網(wǎng)絡(luò)數(shù)據(jù)傳輸)。
當(dāng)然,我們只要滿足進(jìn)程不同就行;所以即便是同一個主機(jī),只要是不同進(jìn)程,基于網(wǎng)絡(luò)來傳輸數(shù)據(jù),也屬于網(wǎng)絡(luò)編程
特殊的情況,對于開發(fā)來說,在條件有限的情況下,一般也都是在一個主機(jī)中運(yùn)行多個進(jìn)程來完成網(wǎng)絡(luò)編程。
但是,我們一定要明確,我們的目的是提供網(wǎng)絡(luò)上不同主機(jī),基于網(wǎng)絡(luò)來傳輸數(shù)據(jù)資源:
-
進(jìn)程A:編程來獲取網(wǎng)絡(luò)資源
-
進(jìn)程B:編程來提供網(wǎng)絡(luò)資源
??網(wǎng)絡(luò)編程中的基本概念
關(guān)于網(wǎng)絡(luò)編程中涉及到的一些基本概念我們有必要了解一下
??發(fā)送端和接收端
在一次網(wǎng)絡(luò)數(shù)據(jù)傳輸時:
發(fā)送端:數(shù)據(jù)的發(fā)送方進(jìn)程,稱為發(fā)送端。發(fā)送端主機(jī)即網(wǎng)絡(luò)通信中的源主機(jī)。
接收端:數(shù)據(jù)的接收方進(jìn)程,稱為接收端。接收端主機(jī)即網(wǎng)絡(luò)通信中的目的主機(jī)。
收發(fā)端:發(fā)送端和接收端兩端,也簡稱為收發(fā)端。
注意:發(fā)送端和接收端只是相對的,只是一次網(wǎng)絡(luò)數(shù)據(jù)傳輸產(chǎn)生數(shù)據(jù)流向后的概念
??請求和響應(yīng)
一般來說,獲取一個網(wǎng)絡(luò)資源,涉及到兩次網(wǎng)絡(luò)數(shù)據(jù)傳輸:
-
第一次:請求數(shù)據(jù)的發(fā)送
-
第二次:響應(yīng)數(shù)據(jù)的發(fā)送。
好比在快餐店點(diǎn)一份炒飯:
-
先要發(fā)起請求:點(diǎn)一份炒飯
-
再有快餐店提供的對應(yīng)響應(yīng):提供一份炒飯
??客戶端和服務(wù)端
服務(wù)端:在常見的網(wǎng)絡(luò)數(shù)據(jù)傳輸場景下,把提供服務(wù)的一方進(jìn)程,稱為服務(wù)端,可以提供對外服務(wù)。
客戶端:獲取服務(wù)的一方進(jìn)程,稱為客戶端。
對于服務(wù)內(nèi)容來說,一般是提供以下幾種:
-
客戶端獲取服務(wù)資源
-
客戶端保存資源在服務(wù)端
好比在銀行辦事:
-
銀行提供取款服務(wù):用戶(客戶端)獲取服務(wù)端資源(銀行替用戶保管的現(xiàn)金)
-
銀行提供存款服務(wù):用戶(客戶端)保存資源(現(xiàn)金)在銀行(服務(wù)端)
??常見的客戶端服務(wù)端模型
最常見的場景,客戶端是指給用戶使用的程序,服務(wù)端是提供用戶服務(wù)的程序:
-
客戶端先發(fā)送請求到服務(wù)端
-
服務(wù)端根據(jù)請求數(shù)據(jù),執(zhí)行相應(yīng)的業(yè)務(wù)處理
-
服務(wù)端返回響應(yīng):發(fā)送業(yè)務(wù)處理結(jié)果
-
客戶端根據(jù)響應(yīng)數(shù)據(jù),展示處理結(jié)果(展示獲取的資源,或提示保存資源的處理結(jié)果)
??Socket套接字
??概念
Socket套接字,是由系統(tǒng)提供用于網(wǎng)絡(luò)通信的技術(shù),是基于TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元?;赟ocket套接字的網(wǎng)絡(luò)程序開發(fā)就是網(wǎng)絡(luò)編程
??分類
Socket套接字主要針對傳輸層協(xié)議劃分為如下三類:
- 流套接字:使用傳輸層TCP協(xié)議
TCP,即Transmission Control Protocol(傳輸控制協(xié)議),傳輸層協(xié)議。
以下為TCP的特點(diǎn)(細(xì)節(jié)請關(guān)注博主后續(xù)創(chuàng)作):
- 有連接
- 可靠傳輸
- 面向字節(jié)流
- 有接收緩沖區(qū),也有發(fā)送緩沖區(qū)
- 大小不限
對于字節(jié)流來說,可以簡單的理解為,傳輸數(shù)據(jù)是基于IO流,流式數(shù)據(jù)的特征就是在IO流沒有關(guān)閉的情
況下,是無邊界的數(shù)據(jù),可以多次發(fā)送,也可以分開多次接收
- 數(shù)據(jù)報套接字:使用傳輸層UDP協(xié)議
UDP,即User Datagram Protocol(用戶數(shù)據(jù)報協(xié)議),傳輸層協(xié)議。
以下為UDP的特點(diǎn)(細(xì)節(jié)請關(guān)注博主后續(xù)創(chuàng)作):
- 無連接
- 不可靠傳輸
- 面向數(shù)據(jù)報
- 有接收緩沖區(qū),無發(fā)送緩沖區(qū)
- 大小受限:一次最多傳輸64k
對于數(shù)據(jù)報來說,可以簡單的理解為,傳輸數(shù)據(jù)是一塊一塊的,發(fā)送一塊數(shù)據(jù)假如100個字節(jié),必須一次發(fā)送,接收也必須一次接收100個字節(jié),而不能分100次,每次接收1個字節(jié)。
- 原始套接字
原始套接字用于自定義傳輸層協(xié)議,用于讀寫內(nèi)核沒有處理的IP協(xié)議數(shù)據(jù)
關(guān)于原始套接字博主不會詳細(xì)介紹,有興趣的小伙伴可以自己區(qū)了解一下。
??Java數(shù)據(jù)報套接字通信模型
java中使用UDP協(xié)議通信,主要基于 DatagramSocket 類來創(chuàng)建數(shù)據(jù)報套接字,并使用
DatagramPacket 作為發(fā)送或接收的UDP數(shù)據(jù)報。對于一次發(fā)送及接收UDP數(shù)據(jù)報的流程如下:
以上只是一次發(fā)送端的UDP數(shù)據(jù)報發(fā)送,及接收端的數(shù)據(jù)報接收,并沒有返回的數(shù)據(jù)。也就是只有請求,沒有響應(yīng)。對于一個服務(wù)端來說,重要的是提供多個客戶端的請求處理及響應(yīng),流程如下:
??Java流套接字通信模型
??Socket編程注意事項
-
客戶端和服務(wù)端:開發(fā)時,經(jīng)常是基于一個主機(jī)開啟兩個進(jìn)程作為客戶端和服務(wù)端,但真實(shí)的場景,一般都是不同主機(jī)。
-
注意目的IP和目的端口號,標(biāo)識了一次數(shù)據(jù)傳輸時要發(fā)送數(shù)據(jù)的終點(diǎn)主機(jī)和進(jìn)程
-
Socket編程我們是使用流套接字和數(shù)據(jù)報套接字,基于傳輸層的TCP或UDP協(xié)議,但應(yīng)用層協(xié)議,也需要考慮,這塊我們在后續(xù)來說明如何設(shè)計應(yīng)用層協(xié)議。
-
關(guān)于端口被占用的問題
如果一個進(jìn)程A已經(jīng)綁定了一個端口,再啟動一個進(jìn)程B綁定該端口,就會報錯,這種情況也叫端口被占用。對于java進(jìn)程來說,端口被占用的常見報錯信息如下:
- 此時需要檢查進(jìn)程B綁定的是哪個端口,再查看該端口被哪個進(jìn)程占用。以下為通過端口號查進(jìn)程
的方式:
在cmd輸入 netstat -ano | findstr 端口號 ,則可以顯示對應(yīng)進(jìn)程的pid。如以下命令顯示了8888進(jìn)程的pid - 在任務(wù)管理器中,通過pid查找進(jìn)程
解決端口被占用的問題:
-
如果占用端口的進(jìn)程A不需要運(yùn)行,就可以關(guān)閉A后,再啟動需要綁定該端口的進(jìn)程B
-
如果需要運(yùn)行A進(jìn)程,則可以修改進(jìn)程B的綁定端口,換為其他沒有使用的端口。文章來源:http://www.zghlxwxcb.cn/news/detail-743576.html
?總結(jié)
關(guān)于《【JavaEE初階】 網(wǎng)絡(luò)編程基礎(chǔ)與Socket套接字簡介》就講解到這兒,感謝大家的支持,歡迎各位留言交流以及批評指正,如果文章對您有幫助或者覺得作者寫的還不錯可以點(diǎn)一下關(guān)注,點(diǎn)贊,收藏支持一下!文章來源地址http://www.zghlxwxcb.cn/news/detail-743576.html
到了這里,關(guān)于【JavaEE初階】 網(wǎng)絡(luò)編程基礎(chǔ)與Socket套接字的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!