欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解TCP協議與UDP協議的原理及區(qū)別

 更新時間:2021年06月11日 08:54:43   作者:酷酷的猿  
網絡編程有三個要素,分別是IP地址、端口號和通信協議,那本文主要講述的是TCP與UDP這兩種通信協議,以及編程的實現,感興趣的可以了解一下

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

首先,我們需要了解一下IP地址、端口號、通信協議的相關知識。

一、IP地址

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

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

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

二、端口號

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

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

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

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

三、通信協議

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

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

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

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

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

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

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

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

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

在這里插入圖片描述

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

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

在這里插入圖片描述

五、TCP編程

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

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

客戶端與服務器端圖解:

在這里插入圖片描述

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

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

目錄結構如下圖

在這里插入圖片描述

客戶端:

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

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

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

4、記得關閉流。

服務器端:

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

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

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

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

5、記得關閉流。

實例:

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

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 {
        
        //創(chuàng)建Socket對象,指定要發(fā)送到服務器端的IP地址,以及服務器端應用程序接收的端口號
        //localhost代表本機IP地址
        Socket client = new Socket("localhost",9000);
        
        //獲取輸出流,用于向服務器端發(fā)送數據
        OutputStream os = client.getOutputStream();
        
        os.write("Java is my friend !".getBytes());
        System.out.println("信息已發(fā)送");

        //關閉流
        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("--服務器端已開啟--");

        //創(chuàng)建ServerSocket對象,這里的端口號必須與客戶端的端口號相同
        ServerSocket server = new ServerSocket(9000);

        //調用方法accept(),用來監(jiān)聽客戶端發(fā)來的請求
        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();
    }
}

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

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

--服務器端已開啟--

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

信息已發(fā)送

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

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

實例分析:

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

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

六、UDP編程

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

發(fā)送方與接收方實現步驟:

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

目錄結構如下圖

在這里插入圖片描述

發(fā)送方:

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

2、準備需要發(fā)送的數據

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

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

5、記得關閉流。

接收方:

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

2、創(chuàng)建一個byte類型數組,用來接收發(fā)送方發(fā)送過來的數據。

3、創(chuàng)建DatagramPacket對象,準備接收數據。

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

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

6、記得關閉流。

實例:

發(fā)送方發(fā)送信息,接收方接收信息,并顯示。

Sender類(發(fā)送方)

package cn.tkrnet.Sender;

import java.io.IOException;
import java.net.*;

public class Sender {
    public static void main(String[] args) throws IOException {

        //創(chuàng)建接受或發(fā)送的數據報套接字,并指定發(fā)送方的端口號為7770
        DatagramSocket ds = new DatagramSocket(7770);   //端口號也可以不指定
        System.out.println("---發(fā)送方---");

        //創(chuàng)建數據報對象,用來發(fā)送數據
        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);    //發(fā)送數據報
        System.out.println("數據已發(fā)送");
        //關閉流
        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("---接收方---");

        //創(chuàng)建數據報套接字對象,指定的端口號要和發(fā)送方發(fā)送數據的端口號相同
        // (不是發(fā)送方的端口號7770,是發(fā)送方發(fā)送數據的端口號7788)
        DatagramSocket ds = new DatagramSocket(7788);

        //創(chuàng)建接收數據報的對象
        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();
    }
}

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

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

---接收方---

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

---發(fā)送方---數據已發(fā)送

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

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

實例分析:

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

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

七、總結

到此這篇關于深入理解TCP協議與UDP協議的原理及區(qū)別的文章就介紹到這了,更多相關TCP協議與UDP協議內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 微信 小程序前端源碼詳解及實例分析

    微信 小程序前端源碼詳解及實例分析

    這篇文章主要介紹了微信 小程序前端源碼詳解及實例分析的相關資料,需要的朋友可以參考下
    2016-09-09
  • 百度HI QQ和MSN 阿里旺旺貿易通MSN在線客服在線聊天代碼

    百度HI QQ和MSN 阿里旺旺貿易通MSN在線客服在線聊天代碼

    有時候業(yè)務需要,需要讓客戶更方便的與我們溝通,就可以參考下面的代碼。
    2010-04-04
  • git中cherry-pick命令的使用教程

    git中cherry-pick命令的使用教程

    這篇文章介紹了git中cherry-pick命令的使用方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • windows開發(fā)記事本程序紀實(二)邏輯篇1

    windows開發(fā)記事本程序紀實(二)邏輯篇1

    從本節(jié)開始介紹windows開發(fā)實現記事本程序的邏輯實現部分。本節(jié)的主要內容有以下3點:1. 主窗口定義2. RichEdit控件的選用及初始化3. 整個程序ICON的選擇
    2014-08-08
  • 好用的VSCode頭部注釋插件Fileheader?Pro

    好用的VSCode頭部注釋插件Fileheader?Pro

    這篇文章主要為大家介紹了VSCode頭部注釋插件Fileheader?Pro的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • ChatGPT 中文調教指南總結

    ChatGPT 中文調教指南總結

    ChatGPT是一個訓練有素的大型語言模型,可以幫助你回答各種問題,本文介紹了ChatGPT 中文調教指南,感興趣的可以了解一下
    2023-05-05
  • 使用MobaXterm連接到遠程服務器的圖文教程

    使用MobaXterm連接到遠程服務器的圖文教程

    這篇文章主要為大家詳細為大家介紹了如何使用MobaXterm連接到遠程服務器,文中通過圖文進行了詳細的講解,有需要的小伙伴可以參考一下
    2023-09-09
  • URL中斜杠/和反斜杠\的區(qū)別小結

    URL中斜杠/和反斜杠\的區(qū)別小結

    這篇文章主要介紹了URL中斜杠/和反斜杠\的區(qū)別小結,純屬個人總結,相對長篇大論較容易理解,需要的朋友可以參考下
    2014-07-07
  • HTTP協議詳細介紹

    HTTP協議詳細介紹

    HTTP是訪問互聯網使用的核心通信協議,也是所有web應用程序使用的通信協議。本文詳細介紹了HTTP協議,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 帶你了解HDFS的Namenode 高可用機制

    帶你了解HDFS的Namenode 高可用機制

    為了Hadoop更好的應用,Hadoop 2.0 及之后版本增加了 Namenode 高可用機制,本文詳細介紹 Namenode 高可用機制,可供大家參考
    2021-08-08

最新評論