目錄
一、網(wǎng)絡編程
1.1、為什么需要網(wǎng)絡編程?
1.2、什么是網(wǎng)絡編程
1.3、發(fā)送端和接收端
?編輯1.4、請求和響應
?編輯1.5、客戶端和服務端?
二、Socket套接字?
2.1、概念
2.2、分類?
2.2.1、流套接字?
2.2.2、數(shù)據(jù)報套接字?
2.2.3、原始套接字?
2.3、Socket編程注意事項?
一、網(wǎng)絡編程
1.1、為什么需要網(wǎng)絡編程?
現(xiàn)在網(wǎng)絡普及程度越來越高,網(wǎng)絡上保存著我們?nèi)粘I钪兴枰母鞣N資源,使用程序通過網(wǎng)絡來獲取這些資源的過程就需要網(wǎng)絡編程來實現(xiàn)。
1.2、什么是網(wǎng)絡編程
網(wǎng)絡編程,是指網(wǎng)絡上的主機,通過不同的進程,以程序的方式實現(xiàn)網(wǎng)絡編程(網(wǎng)絡數(shù)據(jù)傳輸)。
當然,只要滿足不同的進程就行;所以即便是同一個主機,只要是不同的進程,基于網(wǎng)絡來傳輸數(shù)據(jù),也屬于網(wǎng)絡編程。?
對于條件有限情況下,一般也都是在一個主機中運行多個進程來完成網(wǎng)絡編程。
但是,一定要明確,目的是提供網(wǎng)絡上不同主機,基于網(wǎng)絡來傳輸數(shù)據(jù)資源。
- 進程A:編程來獲取網(wǎng)絡資源
- 進程B:編程來提供網(wǎng)絡資源
1.3、發(fā)送端和接收端
在第一次網(wǎng)絡數(shù)據(jù)傳輸時:
發(fā)送端:數(shù)據(jù)的發(fā)送方進程,稱為發(fā)送端,發(fā)送端主機即網(wǎng)絡通信中的源主機。
接收端:數(shù)據(jù)的接收方進程,稱為接收端,接收端主機即網(wǎng)絡通信中的目的主機。
收發(fā)端:發(fā)送端和接收端兩端,簡稱為收發(fā)端。
注意:發(fā)送端和接收端只是相對的,只是一次網(wǎng)絡數(shù)據(jù)傳輸產(chǎn)生數(shù)據(jù)流向后的概念。
1.4、請求和響應
一般來說,獲取一個網(wǎng)絡資源,涉及到兩次數(shù)據(jù)傳輸:
- 第一次:請求數(shù)據(jù)的發(fā)送
- 第二次:響應數(shù)據(jù)的發(fā)送
好比餐館吃飯:先要發(fā)起請求—點份炒飯;響應對方的請求—提供一份炒飯。
1.5、客戶端和服務端?
服務端:在常見的網(wǎng)絡數(shù)據(jù)傳輸?shù)膱鼍跋?,把提供服務的一方進程,稱為服務端,可以對外提供服務。?
客戶端:獲取服務的一方進程,稱為客戶端。
對于服務來說,一般是提供:
- 客戶端獲取服務資源
- 客戶端保存資源在服務端??
好比我們在銀行辦理業(yè)務?
- 銀行提供存款服務:用戶(客戶端)存儲現(xiàn)金(資源)在銀行(服務端).
- 銀行提供取款服務:用戶(客戶端)取存儲的現(xiàn)金(獲取用戶端資源).
常見的客戶端和服務端模型
客戶端是只給用戶使用的程序,服務端是提供用戶服務的程序。?
- ?客戶端先發(fā)送請求到服務端.
- 服務端根據(jù)請求數(shù)據(jù),執(zhí)行相應的業(yè)務處理.
- 服務端返回響應,發(fā)送業(yè)務處理結(jié)果.
- 客戶端根據(jù)響應數(shù)據(jù),展示處理結(jié)果(獲取的資源,或提示保存資源的處理結(jié)果).
?
二、Socket套接字?
2.1、概念
Socket套接字,是由系統(tǒng)提供用于網(wǎng)絡通信的技術(shù),是基于TCP/IP協(xié)議的網(wǎng)絡通信的基本操作單元?;赟ocket套接字的網(wǎng)絡程序開發(fā)就是網(wǎng)絡編程。
2.2、分類?
Socket套接字主要針對傳輸層協(xié)議劃分為如下三類:
2.2.1、流套接字?
使用傳輸層TCP協(xié)議,以下為TCP協(xié)議的特點
- 有連接
- 可靠傳輸
- 面向字節(jié)流
- 有接收緩沖區(qū),也有發(fā)送緩沖區(qū)
- 大小不限
對于字節(jié)流來說,可以簡單理解為,傳輸數(shù)據(jù)是基于IO流,流式數(shù)據(jù)的特征就是在IO流沒有關(guān)閉的情況下,是無邊界的數(shù)據(jù),可以多次發(fā)送,也可以分開多次發(fā)送。
2.2.2、數(shù)據(jù)報套接字?
使用傳輸層UDP協(xié)議 ,以下為UDP協(xié)議的特點
- 有連接
- 不可靠傳輸
- 面向數(shù)據(jù)報
- 有接收緩沖區(qū),也有發(fā)送緩沖區(qū)
- 大小受限:一次最多傳輸64k
對于數(shù)據(jù)報來說,可以簡單理解為,傳輸數(shù)據(jù)是一塊一塊的,發(fā)送一塊數(shù)據(jù)假如是100個字節(jié),必須一次性發(fā)送,接收也必須一次性接收,而不能分一百接收,每次接收一個字節(jié)。
2.2.3、原始套接字?
原始套接字用于自定義傳輸協(xié)議,用于讀寫內(nèi)核沒有處理的IP協(xié)議數(shù)據(jù)。
有興趣了解的盆友可以去看看這位大佬的博客原始套接字?
2.3、Socket編程注意事項?
- 客戶端和服務端:開發(fā)時,經(jīng)常是基于一個主機開啟兩個進程作為客戶端和服務端,但真實的場景,一般都是不同主機。
- 注意目的IP和目的端口號,標識了一次數(shù)據(jù)傳輸時要發(fā)送數(shù)據(jù)的終點主機和進程。
- Socket編程我們是使用流套接字和數(shù)據(jù)報套接字,基于傳輸層的TCP或UDP協(xié)議,但應用層協(xié)議,也需要考慮,這塊我們在后續(xù)來說明如何設計應用層協(xié)議。
- 關(guān)于端口被占用的問題。
如果一個進程A已經(jīng)綁定了一個端口,再啟動一個進程B綁定該端口,就會報錯,這種情況也叫端口占用。對于java進程來說端口占用報錯信息
此時就需要檢查進程B綁定的是哪個端口,再查看哪個端口被占用,以下為端口查看進程的方式
1、打開命令行窗口輸入命令,查找占用端口的應用進程。則可以顯示對應進程的pid。如以下命令顯示了8888進程的pid。
netstat -ano|findstr 端口號
2、在任務管理器中,通過pid查找進程
文章來源:http://www.zghlxwxcb.cn/news/detail-569075.html
解決端口被占用的問題:文章來源地址http://www.zghlxwxcb.cn/news/detail-569075.html
- 如果占用端口的進程A不需要運行,就可以關(guān)閉A后,再啟動需要綁定該端口的進程B
- 如果需要運行A進程,則可以修改進程B的綁定端口,換為其他沒有使用的端口。?
到了這里,關(guān)于網(wǎng)絡編程—Socket套接字詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!