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日

相关文章

  • 使用latex插入数学公式(二)

    当我们需要在文档中插入数学公式时,LaTeX是一个非常强大的工具。在上一篇攻略中,我们介绍了如何使用LaTeX插入数学公式。在本篇攻略中,我们将继续介绍如何使用LaTeX插入数学公式,并提供两个示例说明。 使用LaTeX插入数学公式 在LaTeX中,数学公式可以使用数学环境来插入。以下是一些常用的数学环境: equation:用于插入单行公式。 align:…

    other 2023年5月9日
    00
  • pxcook(像素大厨)

    PxCook(像素大厨)攻略 PxCook(像素大厨)是一款设计师必备的UI设计工具,它可以帮助设计师快速生成设计稿的标注、切图、交互等工作,提高设计效率。下面是PxCook的完整攻略,包括安装、使用和示例说明。 安装 PxCook支持Windows和MacOS系统,可以在官网下载安装包进行安装。安装完成后,打开PxCook,输入注册码或使用试用版即可开始使…

    other 2023年5月5日
    00
  • C++实现约瑟夫环的循环单链表

    C++实现约瑟夫环的循环单链表 1. 算法说明 约瑟夫问题是著名的一种编程问题。一个古老的故事讲述了约瑟夫和他的40个朋友被罗马军队包围在一个洞穴里。他们决定自杀,并排成一个圆圈,从某个位置开始,依据一个固定的规则进行自杀。每一次自杀后,从那个位置开始,依照规则再次自杀,直至只剩下一个人仍然活着。问题就是求这个人的序号。 这个问题可以通过循环单链表来实现。我…

    other 2023年6月27日
    00
  • Windows Powershell 环境变量

    当我们使用Windows Powershell时,环境变量是非常重要的一个概念。环境变量是为了方便我们在命令提示符或者脚本中运行程序时,对必要的系统变量或用户自定义变量进行设置的一种机制。在此,我将详细讲解如何使用Windows Powershell来管理环境变量。 查看环境变量 为了查看当前的环境变量,我们需要打开Powershell,并输入以下命令: G…

    other 2023年6月27日
    00
  • android触摸事件motionevent详解

    Android触摸事件MotionEvent详解 在Android应用程序中,触摸事件是非常重要的。MotionEvent类提供了有关触摸事件的详信息,包括触摸位置、触摸动作和触摸时间等。以下是有关Android触事件MotionEvent的详细信息。 MotionEvent类 MotionEvent类提供了有关摸事件的详细信息以下是MotionEvent类…

    other 2023年5月6日
    00
  • 大m法(bigmmethod)

    当然,我很乐意为您提供有关大M法(Big M Method)的完整攻略。以下是详细的步骤和两个示例: 1. 什么是大M法? 大M法是一种线性规划的求解方法,它通过引入一个大的正数M来将约束条件转化为等式,从而使得问题可以使用标准的线性规划方法求解。大M法通常用于解决线性规划问题中的混合整数规划问题。 2. 大M法的基本步骤 以下是使用大M法解决线性规划问题的…

    other 2023年5月6日
    00
  • Android自定义控件基本原理详解(一)

    下面给出《Android自定义控件基本原理详解(一)》的完整攻略: 1. 什么是自定义控件 自定义控件是指在Android中,使用绘制相关API和布局相关API进行相关操作,创造出符合我们自身应用场景需要的控件。相比Android原生提供的控件,自定义控件更加灵活多变,可以满足更多样化的需求。 2. 自定义控件的三种实现方式 在Android中,实现自定义控…

    other 2023年6月25日
    00
  • Java 字符串的拼接详解

    Java字符串的拼接详解 在Java中,我们可以使用加号(+)或String类的concat()方法来拼接字符串。本篇文章将从以下几个方面详细介绍Java字符串的拼接。 一、使用加号(+)拼接字符串 Java中最常用的拼接字符串方法是使用加号(+)拼接字符串。加号运算符可以连接两个字符串,并且可以连接任意多个字符串。下面是一个简单的示例: String st…

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