更新时间:2022-07-29 11:46:34 来源:极悦 浏览1129次
极悦小编来为大家介绍Java udp通信指南。
在本文中,我们将探索通过用户数据报协议 ( UDP ) 与 Java 进行的网络通信。
UDP 是一种通信协议,它通过网络传输独立的数据包,不保证到达,也不保证传送的顺序。
UDP 与更常见的 TCP 完全不同。但在考虑 UDP 的表面缺点之前,重要的是要了解缺乏开销可以使其比 TCP 快得多。
除了速度之外,我们还需要记住,某些类型的通信不需要 TCP 的可靠性,而是重视低延迟。该视频是一个很好的应用程序示例,它可能受益于通过 UDP 而不是 TCP 运行。
构建 UDP 应用程序与构建 TCP 系统非常相似;唯一的区别是我们不在客户端和服务器之间建立点对点连接。
设置也非常简单。Java 附带了对 UDP 的内置网络支持——它是java.net包的一部分。因此,要通过 UDP 执行网络操作,我们只需要从java.net包中导入Java类:java.net.DatagramSocket和java.net.DatagramPacket。
在接下来的部分中,我们将学习如何设计通过 UDP 进行通信的应用程序;我们将为此应用程序使用流行的回声协议。
首先,我们将构建一个回显服务器,将发送给它的任何消息发回,然后是一个回显客户端,它只向服务器发送任意消息,最后,我们将测试应用程序以确保一切正常。
在 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用于向客户端发送消息。注意与接收数据包的签名不同。这还需要我们向其发送消息的客户端的地址和端口。
现在让我们为这个新服务器推出一个简单的客户端:
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转换为接收数据包。
当回显到达时,我们将字节转换为字符串并返回该字符串。
在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方法中,我们向服务器发送终止消息,以便它可以关闭,同时我们关闭客户端。
在本文中,我们了解了用户数据报协议并成功构建了我们自己的通过 UDP 通信的客户端-服务器应用程序。如果大家想了解更多相关知识,可以关注一下极悦的Java极悦在线学习,里面的课程内容从入门到精通,细致全面,很适合没有基础的小伙伴学习,希望对大家能够有所帮助。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习