日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

网工协议基础(4)TCP/UDP协议

發布時間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网工协议基础(4)TCP/UDP协议 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

往期回顧

?網工協議基礎(1) OSI七層模型

網工協議基礎(2) TCP/IP四層模型

網工協議基礎(3) IP地址

歡迎關注微信公眾號【廈門微思網絡】。www.xmws.cn專業IT認證培訓19周年
主要課程:思科、華為、紅帽、ORACLE、VMware、CISP、PMP等認證培訓及考證?

網絡編程有三個要素,分別是IP地址、端口號和通信協議,這次主要講TCP與UDP這兩種通信協議,以及編程的實現。

IP地址

網絡中的計算機使用IP地址來進行唯一標識,IP地址有IPv4和IPv6兩種類型。IPv4采用十進制或二進制表示形式,十進制是一種比較常用的表示形式,如192.168.1.131,IPv6采用十六進制表示形式,一般不常用。

如何查看IP地址相關信息:

在Windows系統下,打開cmd,輸入命令ipconfig,按回車即可查看。在Linux或Mac系統下,打開終端,使用ifconfig命令,按回車即可查看。

端口號

端口號是計算機中的應用程序的一個整數數字標號,用來區分不同的應用程序。

0 ~ 1024?為被系統使用或保留的端口號,0 ~ 65535為有效的端口號,也就是說我們要對一些程序定義端口號的時候,要選擇1024 ~ 65535范圍內的整數數字。

比如,以前學過的MySQL的端口號是3306,SQLServer的端口號是1433,查了一下Oracle的端口號是1521。

一定要把這些數據庫對應的端口號,藏在深深的腦海里,以后在連接數據庫的時候,會使用到端口號。

通信協議

說的通俗一點,通信協議就是網絡通信中的規則,分為TCP協議和UDP協議兩種。

第一種:TCP協議

英文名:Transmission Control Protocol 中文名:傳輸控制協議 協議說明:TCP是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。

舉例:打電話,需要雙方都接通,才能進行對話

特點:效率低,數據傳輸比較安全

第二種:UDP協議

英文名:User Datagram Protocol 中文名:數據報協議 協議說明:UDP是一種面向無連接的傳輸層通信協議。

舉例:發短信,不需要雙方建立連接,But,數據報的大小應限制在64k以內

特點:效率高,數據傳輸不安全,容易丟包

三要素關系圖與網絡模型圖

01?網絡編程三要素關系圖


?02?OSI參考模型與TCP/IP參考模型


?

TCP編程

TCP是基于字節流的傳輸層通信協議,所以TCP編程是基于IO流編程。

對于客戶端,我們需要使用Socket類來創建對象。對于服務器端,我們需要使用ServerSocket來創建對象,通過對象調用accept()方法來進行監聽是否有客戶端訪問。

客戶端與服務器端圖解:

客戶端與服務器端實現步驟:

前提:創建一個項目,在項目中創建兩個模塊(model),一個模塊用來放客戶端相關代碼,一個模塊用來放服務器端相關代碼。

目錄結構如下圖:

客戶端

1、創建Socket對象,并指定服務器端應用程序的端口號和服務器端主機的IP地址。

2、使用Socket的對象調用getOutputStream()方法來獲取字節輸出流對象。

3、調用字節輸出流的write(byte[] buf)或者write(int b)向服務器發送指定數據。

4、記得關閉流。

服務器端

1、創建ServerSocket對象,并指定該應用程序的端口號,端口號必須和客戶端指定的端口號一樣。

2、使用ServerSocket對象的accept()方法來監聽客戶端發送過來的請求,返回值為Socket對象。

3、調用Socket對象的getInputStream()方法獲取字節輸入流對象

4、調用字節輸入流對象的read(byte[] buf)或read()方法獲取數據。

5、記得關閉流。

實例

客戶端向服務器端發送信息,并顯示在服務器端。

Client類(客戶端)

package?cn.tkrnet.client;import?java.io.IOException; import?java.io.OutputStream; import?java.net.Socket;public?class?Client?{public?static?void?main(String[]?args)?throws?IOException?{//創建Socket對象,指定要發送到服務器端的IP地址,以及服務器端應用程序接收的端口號//localhost代表本機IP地址Socket?client?=?new?Socket("localhost",9000);//獲取輸出流,用于向服務器端發送數據OutputStream?os?=?client.getOutputStream();os.write("Java?is?my?friend?!".getBytes());System.out.println("信息已發送");//關閉流os.close();client.close();} }

Server類(服務器端)

package?cn.tkrnet.server;import?java.io.IOException; import?java.io.InputStream; import?java.net.ServerSocket; import?java.net.Socket;public?class?Server?{public?static?void?main(String[]?args)?throws?IOException?{System.out.println("--服務器端已開啟--");//創建ServerSocket對象,這里的端口號必須與客戶端的端口號相同ServerSocket?server?=?new?ServerSocket(9000);//調用方法accept(),用來監聽客戶端發來的請求Socket?socket?=?server.accept();//獲取輸入流對象InputStream?is?=?socket.getInputStream();//讀取輸入流中的數據int?b?=?0;while?((b?=is.read())?!=?-1){System.out.print((char)b);}//關閉流is.close();socket.close();server.close();} }

提示:在運行程序時,一定要先運行服務器端的程序代碼,再運行客戶端的程序代碼。因為客戶端要向服務器發送請求,前提是服務器端要處于開啟狀態。

Server類(服務器端)運行結果:

--服務器端已開啟--

Client類(客戶端)運行結果:

信息已發送

Client類(客戶端)運行后,Server類(服務器端)收到信息,運行結果:

--服務器端已開啟-- Java?is?my?friend?!

2021 最新 Java 面試題出爐。

實例分析:

服務器端啟動后,服務器端的accept()方法一直處于監聽狀態,直到客戶端連接了服務器,服務器端再從流中讀取客戶端發來的數據。

恕我直言,這是一個超級無敵簡單的單向通信實例。

UDP編程

UDP使用數據報進行數據傳輸,沒有客戶端與服務器端之分,只有發送方與接收方,兩者哪個先啟動都不會報錯,但是會出現數據丟包現象。發送的內容有字數限制,大小必須限制在64k以內。

發送方與接收方實現步驟:

前提:創建一個項目,在項目中創建兩個模塊(model),一個模塊用來放發送方相關代碼,一個模塊用來放接收方相關代碼。

目錄結構如下圖:

發送方

1、創建DatagramSocket對象,可以指定應用程序的端口號,也可以不指定。

2、準備需要發送的數據

3、創建DatagramPacket對象,用來對發送的數據進行打包,需要指定發送內容、發送多少、發送到哪里和接收方的端口號四個參數。

4、調用DatagramSocket對象的send()方法發送數據。

5、記得關閉流。

接收方

1、創建DatagramSocket對象,指定接收方的端口號,這個必須指定。

2、創建一個byte類型數組,用來接收發送方發送過來的數據。

3、創建DatagramPacket對象,準備接收數據。

4、調用DatagramSocket對象的receive()方法用于接收數據。

5、使用String類的構造方法將byte類型的數組中的數據轉化成String類型并顯示。

6、記得關閉流。

實例

發送方發送信息,接收方接收信息,并顯示。

Sender類(發送方)

package?cn.tkrnet.Sender;import?java.io.IOException; import?java.net.*;public?class?Sender?{public?static?void?main(String[]?args)?throws?IOException?{//創建接受或發送的數據報套接字,并指定發送方的端口號為7770DatagramSocket?ds?=?new?DatagramSocket(7770);???//端口號也可以不指定System.out.println("---發送方---");//創建數據報對象,用來發送數據byte[]?b?=?"Java is my friend !".getBytes();//8800為接收方的端口號,netAddress.getByName("localhost")是獲取主機的IP地址DatagramPacket?dp?=?new?DatagramPacket(b,b.length,?InetAddress.getByName("localhost"),7788);ds.send(dp);????//發送數據報System.out.println("數據已發送");//關閉流ds.close();} }

Receiver類(接收方)

package?cn.tkrnet.receiver;import?java.io.IOException; import?java.net.DatagramPacket; import?java.net.DatagramSocket;public?class?Receiver?{public?static?void?main(String[]?args)?throws?IOException?{System.out.println("---接收方---");//創建數據報套接字對象,指定的端口號要和發送方發送數據的端口號相同//?(不是發送方的端口號7770,是發送方發送數據的端口號7788)DatagramSocket?ds?=?new?DatagramSocket(7788);//創建接收數據報的對象byte[]?b?=?new?byte[1024];DatagramPacket?dp?=?new?DatagramPacket(b,b.length);//接收數據ds.receive(dp);System.out.println(new?String(b,0,dp.getLength()));//關閉流ds.close();} }

提示:在運行程序時,先運行發送方程序,還是先運行接收方程序都不會報錯,但是有可能會出現數據丟包,一般我們都先運行接收方的程序代碼,再運行發送方的程序代碼。

Receiver類(接收方)運行結果:

---接收方---

Sender類(發送方)運行結果:

---發送方--- 數據已發送

Sender類(發送方)運行后,Receiver類(接收方)接收到信息,運行結果:

---接收方--- Java is my friend !

實例分析:

只有接收方先啟動運行,才會存在端口號為7788的程序,發送方才能發送數據到指定端口號7788,接收方才能接收數據。

不瞞你說,這也是個超級無敵簡單的單向通信實例。

最后

再來一招

一張圖看懂TCP與UDP的區別

End

總結

以上是生活随笔為你收集整理的网工协议基础(4)TCP/UDP协议的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。