大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java udp通信指南

Java udp通信指南

更新時間:2022-07-29 11:46:34 來源:動力節(jié)點 瀏覽1494次

動力節(jié)點小編來為大家介紹Java udp通信指南。

1. 概述

在本文中,我們將探索通過用戶數(shù)據(jù)報協(xié)議 ( UDP ) 與 Java 進行的網(wǎng)絡通信。

UDP 是一種通信協(xié)議,它通過網(wǎng)絡傳輸獨立的數(shù)據(jù)包,不保證到達,也不保證傳送的順序。

2. 為什么使用 UDP?

UDP 與更常見的 TCP 完全不同。但在考慮 UDP 的表面缺點之前,重要的是要了解缺乏開銷可以使其比 TCP 快得多。

除了速度之外,我們還需要記住,某些類型的通信不需要 TCP 的可靠性,而是重視低延遲。該視頻是一個很好的應用程序示例,它可能受益于通過 UDP 而不是 TCP 運行。

3. 構(gòu)建 UDP 應用程序

構(gòu)建 UDP 應用程序與構(gòu)建 TCP 系統(tǒng)非常相似;唯一的區(qū)別是我們不在客戶端和服務器之間建立點對點連接。

設置也非常簡單。Java 附帶了對 UDP 的內(nèi)置網(wǎng)絡支持——它是java.net包的一部分。因此,要通過 UDP 執(zhí)行網(wǎng)絡操作,我們只需要從java.net包中導入Java類:java.net.DatagramSocket和java.net.DatagramPacket。

在接下來的部分中,我們將學習如何設計通過 UDP 進行通信的應用程序;我們將為此應用程序使用流行的回聲協(xié)議。

首先,我們將構(gòu)建一個回顯服務器,將發(fā)送給它的任何消息發(fā)回,然后是一個回顯客戶端,它只向服務器發(fā)送任意消息,最后,我們將測試應用程序以確保一切正常。

4. 服務器

在 UDP 通信中,單個消息被封裝在DatagramPacket中,通過DatagramSocket發(fā)送。

讓我們從設置一個簡單的服務器開始:

public class EchoServer extends Thread {
    private DatagramSocket socket;
    private boolean running;
    private byte[] buf = new byte[256];
    public EchoServer() {
        socket = new DatagramSocket(4445);
    }
    public void run() {
        running = true;
        while (running) {
            DatagramPacket packet 
              = new DatagramPacket(buf, buf.length);
            socket.receive(packet);            
            InetAddress address = packet.getAddress();
            int port = packet.getPort();
            packet = new DatagramPacket(buf, buf.length, address, port);
            String received 
              = new String(packet.getData(), 0, packet.getLength());            
            if (received.equals("end")) {
                running = false;
                continue;
            }
            socket.send(packet);
        }
        socket.close();
    }
}

我們創(chuàng)建了一個全局DatagramSocket,我們將在整個過程中使用它來發(fā)送數(shù)據(jù)包,一個字節(jié)數(shù)組來包裝我們的消息,以及一個名為running的狀態(tài)變量。

為簡單起見,服務器擴展了Thread,因此我們可以在run方法中實現(xiàn)所有內(nèi)容。

在run內(nèi)部,我們創(chuàng)建了一個 Java while 循環(huán)語句,該循環(huán)一直運行,直到running因某些錯誤或來自客戶端的終止消息而變?yōu)?false。

在循環(huán)的頂部,我們實例化一個DatagramPacket來接收傳入的消息。

接下來,我們在套接字上調(diào)用接收方法。此方法阻塞,直到消息到達并將消息存儲在傳遞給它的DatagramPacket的字節(jié)數(shù)組中。

收到消息后,我們檢索客戶端的地址和端口,因為我們要發(fā)

回響應。

接下來,我們創(chuàng)建一個DatagramPacket用于向客戶端發(fā)送消息。注意與接收數(shù)據(jù)包的簽名不同。這還需要我們向其發(fā)送消息的客戶端的地址和端口。

5. 客戶

現(xiàn)在讓我們?yōu)檫@個新服務器推出一個簡單的客戶端:

public class EchoClient {
    private DatagramSocket socket;
    private InetAddress address;
    private byte[] buf;
    public EchoClient() {
        socket = new DatagramSocket();
        address = InetAddress.getByName("localhost");
    }
    public String sendEcho(String msg) {
        buf = msg.getBytes();
        DatagramPacket packet 
          = new DatagramPacket(buf, buf.length, address, 4445);
        socket.send(packet);
        packet = new DatagramPacket(buf, buf.length);
        socket.receive(packet);
        String received = new String(
          packet.getData(), 0, packet.getLength());
        return received;
    }
    public void close() {
        socket.close();
    }
}

該代碼與服務器的代碼沒有什么不同。我們有我們的全局DatagramSocket和服務器地址。我們在構(gòu)造函數(shù)中實例化這些。

我們有一個單獨的方法將消息發(fā)送到服務器并返回響應。

我們首先將字符串消息轉(zhuǎn)換為字節(jié)數(shù)組,然后創(chuàng)建一個DatagramPacket用于發(fā)送消息。

接下來——我們發(fā)送消息。我們立即將DatagramPacket轉(zhuǎn)換為接收數(shù)據(jù)包。

當回顯到達時,我們將字節(jié)轉(zhuǎn)換為字符串并返回該字符串。

6. 測試

在UDPTest.java類中,我們只需創(chuàng)建一個測試來檢查兩個應用程序的回顯能力:

public class UDPTest {
    EchoClient client;
    @Before
    public void setup(){
        new EchoServer().start();
        client = new EchoClient();
    }
    @Test
    public void whenCanSendAndReceivePacket_thenCorrect() {
        String echo = client.sendEcho("hello server");
        assertEquals("hello server", echo);
        echo = client.sendEcho("server is working");
        assertFalse(echo.equals("hello server"));
    }
    @After
    public void tearDown() {
        client.sendEcho("end");
        client.close();
    }
}

在setup中,我們啟動服務器并創(chuàng)建客戶端。在tearDown方法中,我們向服務器發(fā)送終止消息,以便它可以關(guān)閉,同時我們關(guān)閉客戶端。

7. 結(jié)論

在本文中,我們了解了用戶數(shù)據(jù)報協(xié)議并成功構(gòu)建了我們自己的通過 UDP 通信的客戶端-服務器應用程序。如果大家想了解更多相關(guān)知識,可以關(guān)注一下動力節(jié)點的Java在線學習,里面的課程內(nèi)容從入門到精通,細致全面,很適合沒有基礎的小伙伴學習,希望對大家能夠有所幫助。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 欧美亚洲精品小说一区二三区 | 成人黄色一级视频 | 天天爱天天射 | 色婷婷99综合久久久精品 | 久久网精品视频 | 亚洲a成人7777777久久 | 激情综合网五月激情 | 国产成人亚洲精品91专区高清 | 欧美一级特黄一片免费 | 国产精品午夜激爽毛片 | 久久久国产精品免费 | 中文字幕久久久久久精 | 欧美人与性动交α欧美精品图片 | 中文字幕伦理聚合第一页 | 国产精品入口牛牛影视 | 精品欧美一区二区精品久久 | 青青久草在线 | 四虎免费看黄 | 精品国产一区二区三区19 | 国产一区二区免费在线观看 | 青青青青青国产费线在线观看 | 天天操天天干天天舔 | 国产在线五月综合婷婷 | 欧美亚洲综合网 | 在线韩日 | 99精品全国免费7观看视频 | 一本久道久久综合狠狠爱 | 亚洲悠悠色综合中文字幕 | 五月天在线免费视频 | 一区二区三区精品国产 | 国产福利视频奶水在线 | 日韩一级不卡 | 国产精品一区二区久久精品涩爱 | 在线毛片免费观看 | 国产亚洲欧美日韩综合另类 | 极品专区高清在线 | 亚洲六月丁香婷婷综合 | 91精品久久久久久久久久 | 最新国产午夜精品视频成人 | 四虎免费影院4hu永久免费 | 日韩在线1 |