Java Socket实现UDP编程浅析

Java Socket实现UDP编程浅析

前言

UDP(User Datagram Protocol),即用户数据报协议,是一种无连接的协议。与TCP不同,它不基于连接,只是简单地向网络上的接收者发送数据报。UDP不负责确认接收到过的数据报,也不保证这些数据报能够到达接收者。UDP协议的优点在于传输数据的效率高,缺点在于数据可靠性较差。在某些应用中,数据传输的速度比数据的可靠性更重要,这时候使用UDP是最好的选择。

Java中的Socket类支持TCP和UDP协议的套接字编程,在此我们将讲解如何使用Java Socket实现UDP编程。

Socket类的构造方法

在Java Socket编程中,我们需要使用到Socket和DatagramSocket这两个类,其中Socket适用于TCP协议,在此只介绍DatagramSocket类用于实现UDP协议。DatagramSocket类提供了两个构造方法:

  • DatagramSocket():构造一个未绑定到本地地址和端口号的DatagramSocket。
  • DatagramSocket(int port):构造一个绑定到本地指定端口号的DatagramSocket。

DatagramPacket类的构造方法

DatagramPacket用于在UDP协议中发送和接收数据包。

  • DatagramPacket(byte[] buf, int length):构造一个发送长度为length的数据包对象。
  • DatagramPacket(byte[] buf, int offset, int length):构造一个发送长度为length,并从buf[offset]开始读取的数据包对象。
  • DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):构造一个接收长度为length,并将数据包发送给指定地址和端口号的数据包对象。
  • DatagramPacket(byte[] buf, int length, InetAddress address, int port):构造一个接收长度为length,并将数据包发送给指定地址和端口号的数据包对象。

UDP编程步骤

1.创建DatagramSocket对象

利用DatagramSocket的构造方法创建一个UDP协议的DatagramSocket对象。

DatagramSocket socket = new DatagramSocket();

2.创建DatagramPacket对象

通过DatagramPacket的构造方法创建一个数据包对象。

byte[] buf = "Hello UDP".getBytes();
InetAddress address = InetAddress.getByName("localhost");
int port = 9999;
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);

3.发送数据包

通过DatagramSocket的send()方法来发送数据包。

socket.send(packet);

4.接收数据包

通过DatagramSocket的receive()方法来接收数据包。

byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);

示例1:基于UDP协议的客户端和服务器实现

Server.java

import java.io.IOException;
import java.net.*;

public class Server {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(9999);
        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        System.out.println("服务器已启动,等待客户端发送数据...");
        socket.receive(packet);
        System.out.println("收到客户端发送的数据:" + new String(packet.getData(), 0, packet.getLength()));
        socket.close();
    }
}

Client.java

import java.io.IOException;
import java.net.*;

public class Client {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket();
        byte[] buf = "Hello UDP".getBytes();
        InetAddress address = InetAddress.getByName("localhost");
        int port = 9999;
        DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
        socket.send(packet);
        socket.close();
    }
}

当用Java命令依次运行Server.java和Client.java后,在服务器端会输出接收到的客户端所发来的消息:“Hello UDP”,客户端不会有其他输出。

示例2:基于UDP协议的局域网广播实现

Server.java

import java.io.IOException;
import java.net.*;

public class Server {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(9999);
        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        System.out.println("服务器已启动,等待客户端发送数据...");

        while (true) {
            socket.receive(packet);
            System.out.println("收到客户端发送的数据:" + new String(packet.getData(), 0, packet.getLength()));

            // 发送广播
            byte[] b = "Hello all".getBytes();
            DatagramPacket packet2 = new DatagramPacket(b, b.length, packet.getAddress(), 10000);
            socket.send(packet2);
        }
    }
}

Client.java

import java.io.IOException;
import java.net.*;

public class Client {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket();
        byte[] buf = "Hello UDP".getBytes();
        InetAddress address = InetAddress.getByName("255.255.255.255");
        int port = 9999;
        DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);
        socket.send(packet);

        // 接收广播
        byte[] b = new byte[1024];
        DatagramPacket packet2 = new DatagramPacket(b, b.length);
        socket.receive(packet2);
        System.out.println("收到广播消息:" + new String(packet2.getData(), 0, packet2.getLength()));

        socket.close();
    }
}

当用Java命令依次运行Server.java和Client.java后,客户端会发送广播和消息:“Hello UDP”到局域网内所有设备,并接收到服务器的广播消息:“Hello all”。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Socket实现UDP编程浅析 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • asp封装为DLL风火轮

    首先,需要了解ASP和DLL的概念,ASP是一种服务器端脚本语言,而DLL是一种动态链接库,可以存储可重用代码和数据,提高代码的复用性。 将ASP封装为DLL主要有以下步骤: 创建一个类库项目,例如使用Visual Studio创建C# Class Library项目。 编写类库的代码逻辑,例如编写一个实现风火轮加载效果的类,使用C# OO编程语言实现,可以…

    other 2023年6月25日
    00
  • C++枚举类型enum与enum class的使用

    C++枚举类型enum与enum class的使用攻略 枚举类型是C++中一种用于定义命名常量的数据类型。它允许我们为一组相关的常量赋予有意义的名称,提高代码的可读性和可维护性。C++中有两种枚举类型:enum和enum class。本攻略将详细讲解它们的使用。 enum类型 enum类型是C++中最早引入的枚举类型,它的语法相对简单。下面是enum类型的基…

    other 2023年8月20日
    00
  • 在Linux命令行中使用计算器的5个命令详解

    下面是详细讲解“在Linux命令行中使用计算器的5个命令详解”的完整攻略。 1. expr expr是一个可以在命令行上执行数值运算的工具。它可以执行基本的整数、浮点数、字符串运算,还可以执行变量赋值等操作。下面是使用expr命令进行两个整数相加的示例: $ expr 3 + 5 8 在这个例子中,3和5是要计算的两个整数,”+”表示要执行的运算符。expr…

    other 2023年6月26日
    00
  • C++知识点之inline函数、回调函数和普通函数

    C++中的函数分为普通函数、内联函数和回调函数。 inline函数 什么是inline函数 inline函数是用来代替宏定义的一种方式,它是一种让编译器直接将函数体插入到调用函数处的编译选项。 inline函数的特点 1.为了提高程序的运行效率,编译器将在每个调用函数的位置插入内联函数的代码执行,这将导致程序的体积增加。 2.内联函数不允许递归调用。 3.i…

    other 2023年6月26日
    00
  • 批处理中的echo命令图文详解

    当我们在批处理脚本中使用“echo”命令时,它将会在命令行中输出文本。该命令不仅可以用于输出信息,同时也可以用于将文本输出至文件中。这里将会详细讲解“批处理中的echo命令”的使用方法。 一、基本语法 我们可以使用以下的基本语法来使用“echo”命令: echo [文字或变量] 如果需要将文本输出至文件中,我们可以使用以下语法: echo [文字或变量] &…

    other 2023年6月26日
    00
  • 百度cdn公共库

    百度CDN公共库 百度CDN公共库是一个免费的托管开源代码的资源库,供开发人员在其网站和应用程序中使用。它由百度提供,并根据MIT许可证分发。这意味着,作为网站和开发人员,您可以免费使用和分发其中存储的资源,包括JavaScript、CSS、图像、字体等等。 为什么要使用CDN公共库? 使用CDN公共库有以下几个好处: 加载速度更快:CDN公共库使用广泛,有…

    其他 2023年3月29日
    00
  • jenkins忘记管理员账户密码如何解决?

    Jenkins忘记管理员账户密码如何解决? Jenkins是一个流行的开源自动化工具,它支持持续集成和持续交付管道。管理员账户是Jenkins的最高权限账户,可以管理系统的设置和配置等。但有时候,管理员会忘记他们的密码,这会成为管理员访问Jenkins的一个问题。在本文中,我们将讨论管理员忘记密码的情况,并提供解决方案。 解决管理员忘记密码的方法 方法一:使…

    其他 2023年3月28日
    00
  • npm使用国内淘宝镜像的方法

    以下是“npm使用国内淘宝镜像的方法”的完整攻略: npm使用国内淘宝镜像的方法 npm是Node.js的包管理器,可以帮助我们装和管理各种Node.js模块。但是,由于npm默认使用的是国外的镜像源,下载速度较慢,因此我们可以国内的淘宝镜像来加速下载。本攻略详细讲解如何使用npm国内淘宝镜像,包括设置镜像源、使用cnpm等。 设置镜像 使用npm国内淘宝镜…

    other 2023年5月8日
    00
合作推广
合作推广
分享本页
返回顶部