<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

IP地址、端口號、通信協議的相關知識 TCP和UDP通信協議簡述

lcdz66 ? 來源:雨飛工作室 ? 2023-07-18 11:20 ? 次閱讀

網絡編程有三個要素,分別是IP地址、端口號和通信協議。本文主要講述的是TCP與UDP這兩種通信協議,以及編程的實現。首先,我們需要了解一下IP地址、端口號、通信協議的相關知識。

一、IP地址

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

如何查看IP地址相關信息在Windows系統下,打開cmd,輸入命令ipconfig,按回車即可查看。在Linux或Mac系統下,打開終端,使用ifconfig命令,按回車即可查看。

二、端口號

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

0 ~ 1023未被系統使用或保留的端口號,1024 ~ 65535為有效的端口號,也就是說我們要對一些程序定義端口號的時候,要選擇1024 ~ 65535范圍內的整數數字。比如,MySQL的端口號是3306,SQLServer的端口號是1433,查了一下Oracle的端口號是1521。一定要把這些數據庫對應的端口號,藏在深深的腦海里,以后在連接數據庫的時候,會使用到端口號。

三、通信協議

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

第一種:TCP協議

英文名:Transmission Control Protocol 中文名:傳輸控制協議。

協議說明:TCP是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。

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

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

第二種:UDP協議

英文名:User Datagram Protocol 中文名:數據報協議。

協議說明:UDP是一種面向無連接的傳輸層通信協議。

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

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

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

1、網絡編程三要素關系圖

wKgZomS2BWOAX1-gAACpWP7Y8i8994.jpg

注:圖中端口號、IP地址為演示,并非真實。

2、OSI參考模型與TCP/IP參考模型

wKgZomS2BWOAXNChAADC1Uakdyo769.jpg

五、TCP編程

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

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

客戶端與服務器端圖解:

wKgZomS2BWOAGLbEAAIOc1It5Gg675.png

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

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

目錄結構如下圖:

wKgaomS2BWOAGbBHAACwS2YfpPs887.jpg

客戶端:

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類(客戶端):


packagecn.tkrnet.client; importjava.io.IOException; importjava.io.OutputStream; importjava.net.Socket; publicclassClient{ publicstaticvoidmain(String[]args)throwsIOException{  //創建Socket對象,指定要發送到服務器端的IP地址,以及服務器端應用程序接收的端口號 //localhost代表本機IP地址 Socketclient=newSocket("localhost",9000);  //獲取輸出流,用于向服務器端發送數據 OutputStreamos=client.getOutputStream();  os.write("Javaismyfriend!".getBytes()); System.out.println("信息已發送"); //關閉流 os.close(); client.close(); } } Server類(服務器端):

packagecn.tkrnet.server; importjava.io.IOException; importjava.io.InputStream; importjava.net.ServerSocket; importjava.net.Socket; publicclassServer{ publicstaticvoidmain(String[]args)throwsIOException{ System.out.println("--服務器端已開啟--"); //創建ServerSocket對象,這里的端口號必須與客戶端的端口號相同 ServerSocketserver=newServerSocket(9000); //調用方法accept(),用來監聽客戶端發來的請求 Socketsocket=server.accept(); //獲取輸入流對象 InputStreamis=socket.getInputStream(); //讀取輸入流中的數據 intb=0; while((b=is.read())!=-1){ System.out.print((char)b); } //關閉流 is.close(); socket.close(); server.close(); } } 提示:在運行程序時,一定要先運行服務器端的程序代碼,再運行客戶端的程序代碼。因為客戶端要向服務器發送請求,前提是服務器端要處于開啟狀態。 Server類(服務器端)運行結果:

--服務器端已開啟-- Client類(客戶端)運行結果:

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

--服務器端已開啟-- Javaismyfriend! 實例分析: 服務器端啟動后,服務器端的accept()方法一直處于監聽狀態,直到客戶端連接了服務器,服務器端再從流中讀取客戶端發來的數據。恕我直言,這是一個超級無敵簡單的單向通信實例。 

六、UDP編程

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

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

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

目錄結構如下圖:

wKgaomS2BWOAMPVdAADDKVEwejg583.jpg

發送方:

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

2、準備需要發送的數據。

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

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

5、記得關閉流。

接收方:

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

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

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

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

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

6、記得關閉流。

實例:

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

Sender類(發送方):


packagecn.tkrnet.Sender; importjava.io.IOException; importjava.net.*; publicclassSender{ publicstaticvoidmain(String[]args)throwsIOException{ //創建接受或發送的數據報套接字,并指定發送方的端口號為7770 DatagramSocketds=newDatagramSocket(7770);//端口號也可以不指定 System.out.println("---發送方---"); //創建數據報對象,用來發送數據 byte[]b="Java is my friend !".getBytes(); //8800為接收方的端口號,netAddress.getByName("localhost")是獲取主機的IP地址 DatagramPacketdp=newDatagramPacket(b,b.length,InetAddress.getByName("localhost"),7788); ds.send(dp);//發送數據報 System.out.println("數據已發送"); //關閉流 ds.close(); } } Receiver類(接收方)

packagecn.tkrnet.receiver; importjava.io.IOException; importjava.net.DatagramPacket; importjava.net.DatagramSocket; publicclassReceiver{ publicstaticvoidmain(String[]args)throwsIOException{ System.out.println("---接收方---"); //創建數據報套接字對象,指定的端口號要和發送方發送數據的端口號相同 //(不是發送方的端口號7770,是發送方發送數據的端口號7788) DatagramSocketds=newDatagramSocket(7788); //創建接收數據報的對象 byte[]b=newbyte[1024]; DatagramPacketdp=newDatagramPacket(b,b.length); //接收數據 ds.receive(dp); System.out.println(newString(b,0,dp.getLength())); //關閉流 ds.close(); } } 提示:在運行程序時,先運行發送方程序,還是先運行接收方程序都不會報錯,但是有可能會出現數據丟包,一般我們都先運行接收方的程序代碼,再運行發送方的程序代碼。 Receiver類(接收方)運行結果:

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

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

---接收方---  Java is my friend ! 實例分析: 只有接收方先啟動運行,才會存在端口號為7788的程序,發送方才能發送數據到指定端口號7788,接收方才能接收數據。不瞞你說,這也是個超級無敵簡單的單向通信實例。 

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 通信協議
    +關注

    關注

    28

    文章

    773

    瀏覽量

    39963
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1285

    瀏覽量

    78477
  • UDP
    UDP
    +關注

    關注

    0

    文章

    311

    瀏覽量

    33694
  • 網絡編程
    +關注

    關注

    0

    文章

    64

    瀏覽量

    9999

原文標題:終于有人把TCP協議與UDP協議給搞明白了

文章出處:【微信號:雨飛工作室,微信公眾號:雨飛工作室】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    【我是電子發燒友】TCP & UDP 端口號分配

    本帖最后由 lee_st 于 2017-5-8 13:57 編輯 轉一個常識TCP端口UDP端口。由于TCP
    發表于 05-08 11:29

    TCP/IP協議里面端口號怎么設置

    TCP/IP協議通訊的時候經常因為端口號感到困惑,有些設備供應商說并不需要端口號就可以用,但是LABVIEW里面必須要填
    發表于 09-16 13:33

    TCP通信協議-Labview上位機

    現在用單片機進行信息采集,通過GPRS模塊上傳到PC,用Labview做上位機,TCP通信協議,想請教一下,TCP通信協議和Modbus TCP
    發表于 12-10 08:58

    TCP/IP協議是什么

    一、TCP/IP協議1、TCP/IP通信協議是目前最完整、最被廣泛支持的
    發表于 08-05 07:51

    什么是TCP/IP通信協議

    什么是TCP/IP通信協議呢?IP地址有何作用?分為哪幾類?
    發表于 11-01 06:08

    SPI通信協議的基礎知識解析

    SPI通信協議詳解寫在最前: 本文講述了SPI通信協議的基本內容包括如下SPI的基礎知識SPI的讀寫時序本文重點參考 英文維基百科 中文維基百科 百度百科注意: 倘若讀者有足夠的耐心和英文
    發表于 12-13 08:05

    什么是通信協議?如何解決IP地址荒呢

    為什么需要網絡通信?實現網絡通信需要哪些支持?什么是通信協議?如何解決IP地址荒呢?
    發表于 12-23 06:34

    通信協議相關資料分享

    嵌入式通信協議:分為“大協議”和“小協議”兩種“大協議”:主要用來進行系統外的整個系統之間的通信,協議
    發表于 12-24 08:15

    上位機TCP客戶端通信連接失敗怎么辦

    (1)上位機TCP客戶端通信連接失敗1)ping IP地址2)telnet IP 端口號ubun
    發表于 02-16 06:56

    淺析ModBus通信協議相關知識

    不影響各PC執行本身的控制任務。   內部通信協議   Modbus協議包括ASCII、RTU、TCP等,并沒有規定物理層。此協議定義了控制器能夠認識和使用的消息結構,而不管它們是經過
    發表于 05-05 15:51

    Modbus通信協議教程

    Modbus通信協議教程Modbus通信協議教程Modbus通信協議教程
    發表于 12-08 14:14 ?72次下載

    通信協議中的HTTP、TCP、UDP你了解多少(上)

    TCP HTTP UDP: 都是通信協議,也就是通信時所遵守的規則,只有雙方按照這個規則“說話”,對方才能理解或為之服務。
    的頭像 發表于 02-13 14:19 ?750次閱讀
    <b class='flag-5'>通信協議</b>中的HTTP、<b class='flag-5'>TCP</b>、<b class='flag-5'>UDP</b>你了解多少(上)

    通信協議的特點

    通信協議的種類和特點目前常見的通信協議主要有:NetBEUI、IPX/SPX、NWLink、TCP/IP,在這幾種協議中用得最多、最為復雜的
    發表于 05-06 14:57 ?1130次閱讀

    一文搞明白TCP協議UDP協議(上)

    網絡編程有三個要素,分別是IP地址、端口號通信協議,那本文主要講述的是TCPUDP這兩種
    的頭像 發表于 05-18 17:17 ?526次閱讀
    一文搞明白<b class='flag-5'>TCP</b><b class='flag-5'>協議</b>與<b class='flag-5'>UDP</b><b class='flag-5'>協議</b>(上)

    一文搞明白TCP協議UDP協議(下)

    網絡編程有三個要素,分別是IP地址、端口號通信協議,那本文主要講述的是TCPUDP這兩種
    的頭像 發表于 05-18 17:17 ?494次閱讀
    一文搞明白<b class='flag-5'>TCP</b><b class='flag-5'>協議</b>與<b class='flag-5'>UDP</b><b class='flag-5'>協議</b>(下)
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>