专注Java教育14年 全国咨询/投诉热线:444-1124-454
星辉LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java udp通信指南

Java udp通信指南

更新时间:2022-07-29 11:46:34 来源:星辉 浏览1016次

星辉小编来为大家介绍Java udp通信指南。

1. 概述

在本文中,我们将探索通过用户数据报协议 ( UDP ) 与 Java 进行的网络通信。

UDP 是一种通信协议,它通过网络传输独立的数据包,不保证到达,也不保证传送的顺序。

2. 为什么使用 UDP?

UDP 与更常见的 TCP 完全不同。但在考虑 UDP 的表面缺点之前,重要的是要了解缺乏开销可以使其比 TCP 快得多。

除了速度之外,我们还需要记住,某些类型的通信不需要 TCP 的可靠性,而是重视低延迟。该视频是一个很好的应用程序示例,它可能受益于通过 UDP 而不是 TCP 运行。

3. 构建 UDP 应用程序

构建 UDP 应用程序与构建 TCP 系统非常相似;唯一的区别是我们不在客户端和服务器之间建立点对点连接。

设置也非常简单。Java 附带了对 UDP 的内置网络支持——它是java.net包的一部分。因此,要通过 UDP 执行网络操作,我们只需要从java.net包中导入Java类:java.net.DatagramSocket和java.net.DatagramPacket。

在接下来的部分中,我们将学习如何设计通过 UDP 进行通信的应用程序;我们将为此应用程序使用流行的回声协议。

首先,我们将构建一个回显服务器,将发送给它的任何消息发回,然后是一个回显客户端,它只向服务器发送任意消息,最后,我们将测试应用程序以确保一切正常。

4. 服务器

在 UDP 通信中,单个消息被封装在DatagramPacket中,通过DatagramSocket发送。

让我们从设置一个简单的服务器开始:

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();
    }
}

我们创建了一个全局DatagramSocket,我们将在整个过程中使用它来发送数据包,一个字节数组来包装我们的消息,以及一个名为running的状态变量。

为简单起见,服务器扩展了Thread,因此我们可以在run方法中实现所有内容。

在run内部,我们创建了一个 Java while 循环语句,该循环一直运行,直到running因某些错误或来自客户端的终止消息而变为 false。

在循环的顶部,我们实例化一个DatagramPacket来接收传入的消息。

接下来,我们在套接字上调用接收方法。此方法阻塞,直到消息到达并将消息存储在传递给它的DatagramPacket的字节数组中。

收到消息后,我们检索客户端的地址和端口,因为我们要发

回响应。

接下来,我们创建一个DatagramPacket用于向客户端发送消息。注意与接收数据包的签名不同。这还需要我们向其发送消息的客户端的地址和端口。

5. 客户

现在让我们为这个新服务器推出一个简单的客户端:

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和服务器地址。我们在构造函数中实例化这些。

我们有一个单独的方法将消息发送到服务器并返回响应。

我们首先将字符串消息转换为字节数组,然后创建一个DatagramPacket用于发送消息。

接下来——我们发送消息。我们立即将DatagramPacket转换为接收数据包。

当回显到达时,我们将字节转换为字符串并返回该字符串。

6. 测试

在UDPTest.java类中,我们只需创建一个测试来检查两个应用程序的回显能力:

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中,我们启动服务器并创建客户端。在tearDown方法中,我们向服务器发送终止消息,以便它可以关闭,同时我们关闭客户端。

7. 结论

在本文中,我们了解了用户数据报协议并成功构建了我们自己的通过 UDP 通信的客户端-服务器应用程序。如果大家想了解更多相关知识,可以关注一下星辉的Java星辉在线学习,里面的课程内容从入门到精通,细致全面,很适合没有基础的小伙伴学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>