0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

jf_78858299 ? 來源:Linux云計算網(wǎng)絡(luò) ? 作者:Linux云計算網(wǎng)絡(luò) ? 2023-05-18 17:17 ? 次閱讀

Server類(服務(wù)器端)

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("--服務(wù)器端已開啟--");

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

        //調(diào)用方法accept(),用來監(jiān)聽客戶端發(fā)來的請求
        Socket socket = server.accept();

        //獲取輸入流對象
        InputStream is = socket.getInputStream();

        //讀取輸入流中的數(shù)據(jù)
        int b = 0;
        while ((b =is.read()) != -1){
            System.out.print((char)b);
        }
        //關(guān)閉流
        is.close();
        socket.close();
        server.close();
    }
}

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

Server類(服務(wù)器端)運行結(jié)果:

--服務(wù)器端已開啟--

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

信息已發(fā)送

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

--服務(wù)器端已開啟--
Java is my friend !

實例分析:

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

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

六、UDP編程

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

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

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

目錄結(jié)構(gòu)如下圖

圖片

發(fā)送方

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

2、準(zhǔn)備需要發(fā)送的數(shù)據(jù)

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

4、調(diào)用DatagramSocket對象的send()方法發(fā)送數(shù)據(jù)。

5、記得關(guān)閉流。

接收方

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

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

3、創(chuàng)建DatagramPacket對象,準(zhǔn)備接收數(shù)據(jù)。

4、調(diào)用DatagramSocket對象的receive()方法用于接收數(shù)據(jù)。

5、使用String類的構(gòu)造方法將byte類型的數(shù)組中的數(shù)據(jù)轉(zhuǎn)化成String類型并顯示。

6、記得關(guān)閉流。

實例

發(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ā)送的數(shù)據(jù)報套接字,并指定發(fā)送方的端口號為7770
        DatagramSocket ds = new DatagramSocket(7770);   //端口號也可以不指定
        System.out.println("---發(fā)送方---");

        //創(chuàng)建數(shù)據(jù)報對象,用來發(fā)送數(shù)據(jù)
        byte[] b = "Java is my friend !".getBytes();

        //8800為接收方的端口號,netAddress.getByName("localhost")是獲取主機(jī)的IP地址
        DatagramPacket dp = new DatagramPacket(b,b.length, InetAddress.getByName("localhost"),7788);

        ds.send(dp);    //發(fā)送數(shù)據(jù)報
        System.out.println("數(shù)據(jù)已發(fā)送");
        //關(guān)閉流
        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)建數(shù)據(jù)報套接字對象,指定的端口號要和發(fā)送方發(fā)送數(shù)據(jù)的端口號相同
        // (不是發(fā)送方的端口號7770,是發(fā)送方發(fā)送數(shù)據(jù)的端口號7788)
        DatagramSocket ds = new DatagramSocket(7788);

        //創(chuàng)建接收數(shù)據(jù)報的對象
        byte[] b = new byte[1024];
        DatagramPacket dp = new DatagramPacket(b,b.length);

        //接收數(shù)據(jù)
        ds.receive(dp);
        System.out.println(new String(b,0,dp.getLength()));
        //關(guān)閉流
        ds.close();
    }
}

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

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

---接收方---

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

---發(fā)送方---
數(shù)據(jù)已發(fā)送

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

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

實例分析:

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 通信協(xié)議
    +關(guān)注

    關(guān)注

    28

    文章

    840

    瀏覽量

    40215
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1347

    瀏覽量

    78933
  • UDP
    UDP
    +關(guān)注

    關(guān)注

    0

    文章

    322

    瀏覽量

    33849
  • 端口
    +關(guān)注

    關(guān)注

    4

    文章

    948

    瀏覽量

    31984
  • 網(wǎng)絡(luò)編程
    +關(guān)注

    關(guān)注

    0

    文章

    68

    瀏覽量

    10055
收藏 人收藏

    評論

    相關(guān)推薦

    TCP協(xié)議UDP協(xié)議對比 UDP協(xié)議的原理及應(yīng)用

    對延時或抖動要求很高的情景并不適用。為此,UDP(User Datagram Protocol,用戶數(shù)據(jù)報協(xié)議)被提出。UDP雖然應(yīng)用較為廣泛,比如DNS查詢等,但
    的頭像 發(fā)表于 10-26 15:05 ?3371次閱讀
    <b class='flag-5'>TCP</b><b class='flag-5'>協(xié)議</b>和<b class='flag-5'>UDP</b><b class='flag-5'>協(xié)議</b>對比 <b class='flag-5'>UDP</b><b class='flag-5'>協(xié)議</b>的原理及應(yīng)用

    linxu網(wǎng)絡(luò)協(xié)議分析:IP協(xié)議、TCP協(xié)議、UDP協(xié)議

    本章節(jié)主要介紹linxu網(wǎng)絡(luò)模型、以及常用的網(wǎng)絡(luò)協(xié)議分析以太網(wǎng)協(xié)議、IP協(xié)議、TCP協(xié)議、UDP
    的頭像 發(fā)表于 10-28 16:44 ?3727次閱讀
    linxu網(wǎng)絡(luò)<b class='flag-5'>協(xié)議</b>分析:IP<b class='flag-5'>協(xié)議</b>、<b class='flag-5'>TCP</b><b class='flag-5'>協(xié)議</b>、<b class='flag-5'>UDP</b><b class='flag-5'>協(xié)議</b>

    TCP協(xié)議UDP協(xié)議的區(qū)別有哪些

    無法實現(xiàn);(3)TCP 協(xié)議有效載荷小于 UDP 協(xié)議(基于 MSS 計算),UDP 性能高于 TCP
    發(fā)表于 08-06 08:43

    TCPUDP協(xié)議簡析

    、前言TCPUDP協(xié)議TCP/IP協(xié)議的核心。TCP
    發(fā)表于 12-15 08:13

    通訊協(xié)議TCPUDP協(xié)議使用方法

    通訊協(xié)議TCPUDP協(xié)議UDP會把數(shù)據(jù)股腦兒地發(fā)送出去,并不會在意是否全部收到,適用于廣播類
    發(fā)表于 01-21 14:53

    LinuxUDP協(xié)議編程

    LinuxUDP協(xié)議編程 介紹UDP協(xié)議,并提供個適用于客戶端和服務(wù)器端的實例子程序?!?/div>
    發(fā)表于 10-16 22:22 ?3948次閱讀
    Linux<b class='flag-5'>下</b>的<b class='flag-5'>UDP</b><b class='flag-5'>協(xié)議</b>編程

    (WiFi干貨)WiFi模塊的TCPUDP協(xié)議

    TCPUDP都是網(wǎng)絡(luò)通信協(xié)議,也就是通信時都要遵守的規(guī)則,雙方在同規(guī)則”交流”,才能理解或者為之服務(wù).?
    的頭像 發(fā)表于 09-11 09:02 ?3w次閱讀

    tcpudp協(xié)議的異同

    UDP 協(xié)議 UDP 協(xié)議是無連接、不可靠的個傳輸層協(xié)議。下圖是
    的頭像 發(fā)表于 11-12 14:45 ?3984次閱讀
    <b class='flag-5'>tcp</b>和<b class='flag-5'>udp</b><b class='flag-5'>協(xié)議</b>的異同

    TCP協(xié)議UDP協(xié)議的區(qū)別和相同點有哪些 看懂TCP協(xié)議UDP協(xié)議的優(yōu)缺點

    首先咱們弄清楚,TCP協(xié)議和UCP協(xié)議TCP/IP協(xié)議的聯(lián)系,很多人犯糊涂了,直都是說
    的頭像 發(fā)表于 05-26 14:35 ?9450次閱讀
    <b class='flag-5'>TCP</b><b class='flag-5'>協(xié)議</b>與<b class='flag-5'>UDP</b><b class='flag-5'>協(xié)議</b>的區(qū)別和相同點有哪些 <b class='flag-5'>一</b><b class='flag-5'>文</b>看懂<b class='flag-5'>TCP</b><b class='flag-5'>協(xié)議</b>與<b class='flag-5'>UDP</b><b class='flag-5'>協(xié)議</b>的優(yōu)缺點

    TCP協(xié)議UDP協(xié)議的區(qū)別

    TCP/IP協(xié)議中有兩個具有代表性的傳輸層協(xié)議,分別是TCP協(xié)議UDP
    的頭像 發(fā)表于 03-21 10:39 ?1144次閱讀

    明白TCP協(xié)議UDP協(xié)議(上)

    網(wǎng)絡(luò)編程有三個要素,分別是IP地址、端口號和通信協(xié)議,那本文主要講述的是TCPUDP這兩種通信協(xié)議,以及編程的實現(xiàn)。 首先,我們需要了解一下
    的頭像 發(fā)表于 05-18 17:17 ?635次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>搞</b><b class='flag-5'>明白</b><b class='flag-5'>TCP</b><b class='flag-5'>協(xié)議</b>與<b class='flag-5'>UDP</b><b class='flag-5'>協(xié)議</b>(上)

    TCP協(xié)議UDP協(xié)議最核心的區(qū)別是什么?

    對于TCP協(xié)議UDP協(xié)議,大家應(yīng)該都有所耳聞。TCP協(xié)議
    發(fā)表于 06-15 09:37 ?637次閱讀
    <b class='flag-5'>TCP</b><b class='flag-5'>協(xié)議</b>和<b class='flag-5'>UDP</b><b class='flag-5'>協(xié)議</b>最核心的區(qū)別是什么?

    udp是什么協(xié)議 TCPUDP的區(qū)別

    TCP協(xié)議提供可靠的數(shù)據(jù)傳輸,UDP協(xié)議提供盡量高效的數(shù)據(jù)傳輸。TCP協(xié)議通過使用序列號、確認(rèn)應(yīng)
    的頭像 發(fā)表于 06-26 17:47 ?1.1w次閱讀

    什么是UDP協(xié)議?什么場景會去用這種協(xié)議呢?

    傳輸層除了TCP協(xié)議,還有個很重要的協(xié)議UDP協(xié)議。接下來看下UDP
    發(fā)表于 07-10 15:50 ?1143次閱讀
    什么是<b class='flag-5'>UDP</b><b class='flag-5'>協(xié)議</b>?什么場景<b class='flag-5'>下</b>會去用這種<b class='flag-5'>協(xié)議</b>呢?

    TCP/IP協(xié)議進(jìn)階課程:5、UDP協(xié)議

    電子發(fā)燒友網(wǎng)站提供《TCP/IP協(xié)議進(jìn)階課程:5、UDP協(xié)議.pdf》資料免費下載
    發(fā)表于 07-31 11:48 ?0次下載
    <b class='flag-5'>TCP</b>/IP<b class='flag-5'>協(xié)議</b>進(jìn)階課程:5、<b class='flag-5'>UDP</b><b class='flag-5'>協(xié)議</b>