Java最高

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程

1.概述

在本文中,我们将探索通过用户数据报协议(UDP)。

UDP是一种通信协议在网络上传输独立的包,不保证到达,也不保证发送的顺序

互联网上的大多数通信都是通过传输控制协议(TCP)进行的,然而,UDP也有它的位置,我们将在下一节中探讨它。

2.为什么使用UDP ?

UDP是完全不同的从更常见的TCP。但是,在考虑UDP的表面缺点之前,有一点很重要,那就是缺少开销会使它比TCP快得多。

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

3.构建UDP应用程序

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

设置也非常简单。Java附带了对UDP的内置网络支持——它是java.net包中。因此,要在UDP上执行网络操作,我们只需要从java.net包:java.net.DatagramSocketjava.net.DatagramPacket

在下面的章节中,我们将学习如何设计UDP通信的应用程序;对于这个应用程序,我们将使用流行的echo协议。

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

4.服务器

在UDP通信中,单个消息被封装在一个DatagramPacket哪个是通过a发送的DatagramSocket

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

public class EchoServer extends Thread {private DatagramSocket socket;私人布尔运行;private byte[] buf = new byte[256];public EchoServer() {socket = new DatagramSocket(4445);} public void run(){运行= true;while (running) {DatagramPacket packet = new DatagramPacket(buf, buf.length);socket.receive(包);InetAddress address = packet.getAddress();int port = packet.getPort();数据包= new DatagramPacket(buf, buf.)长度、地址、端口); String received = new String(packet.getData(), 0, packet.getLength()); if (received.equals("end")) { running = false; continue; } socket.send(packet); } socket.close(); } }

我们创造了一个全球性的DatagramSocket我们将使用它来发送整个数据包,一个字节数组来包装我们的消息,以及一个名为运行

为了简单起见,服务器正在扩展线程,因此我们可以实现运行方法。

内部运行,我们创建一个while循环,只运行到运行被某些错误或来自客户端的终止消息更改为false。

在循环的顶部,我们实例化aDatagramPacket接收传入的消息。

接下来,我们调用收到方法。方法的字节数组中存储消息,直到消息到达为止DatagramPacket传递给它。

接收到消息后,我们检索客户机的地址和端口,因为我们将发送响应
回来。

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

5.客户端

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

public class EchoClient {private DatagramSocket socket;私人InetAddress地址;私人byte[]缓冲区;public EchoClient() {socket = new DatagramSocket();地址= InetAddress.getByName(“localhost”);} public String sendEcho(String msg) {buf = msg. getbytes ();DatagramPacket packet = new DatagramPacket(buf, buf。长度,地址,4445);socket.send(包);数据包= new DatagramPacket(buf, buf.length);socket.receive(包); 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客户端;@Before public void setup(){new EchoServer().start();client = new EchoClient();} @Test public void whencansendandreceivepacket_thcorrect () {String echo = client. echo;sendEcho(“你好服务器”);assertequal(“你好服务器”,回声);回声=客户。sendEcho(“服务器工作”);assertFalse(回声。=(“你好服务器”));} @After public void tearDown() {client.sendEcho("end"); client.close(); } }

设置,我们启动服务器并创建客户机。而在拆卸方法时,我们向服务器发送终止消息,以便关闭服务器,同时关闭客户端。

7.结论

在本文中,我们了解了用户数据报协议,并成功构建了自己的通过UDP通金宝搏官网188be信的客户机-服务器应用程序。

要获得本文中使用的示例的完整源代码,您可以查看GitHub项目

Java底部

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程
本文评论关闭!