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日

相关文章

  • 指定端口号的scp

    指定端口号的SCP攻略 SCP(Secure Copy)是一种基于SSH协议的文件传输工具,用于在本地计算机和远程计算机之间传文件。在使用时,可以通过指定端口号来连接远程计算机。本攻略将详细讲解如何指定端口号的,包括SCP的基本概念、如何指定端口号、以及两个示例说明。 SCP的基本概念 SCP是一种基于SSH协议的文件传输工具,用于在本地计算机和远程计算机之…

    other 2023年5月7日
    00
  • Windows10系统键盘大小写切换键(Caps Lock)异常问题

    Windows10系统键盘大小写切换键(Caps Lock)异常问题攻略 问题描述 在使用Windows10系统时,有时候会遇到键盘大小写切换键(Caps Lock)异常的问题。这个问题会导致键盘的大小写切换功能无法正常工作,给用户带来不便。下面是解决这个问题的完整攻略。 解决方法 方法一:检查键盘设置 打开“设置”菜单,可以通过点击任务栏上的“开始”按钮,…

    other 2023年8月16日
    00
  • asp.net中MD5 16位和32位加密函数

    ASP.NET中MD5 16位和32位加密函数攻略 在ASP.NET中,可以使用MD5算法对字符串进行加密。MD5加密算法可以生成一个128位的哈希值,但是常用的是将其截取为16位或32位的字符串表示形式。下面是详细的攻略,包含两个示例说明。 1. MD5 16位加密函数 MD5 16位加密函数将MD5生成的128位哈希值截取为16位字符串。下面是一个示例代…

    other 2023年7月28日
    00
  • 苹果应用开发AppStore常见问题解决方法以及上传步骤图文教程

    苹果应用开发AppStore常见问题解决方法以及上传步骤图文教程 如果你是一名iOS应用开发者,那么你一定需要了解如何将你的应用上传到App Store上线。但是在这个过程中,你可能会遇到一些问题,例如审核被拒绝、应用上传失败等等。本篇攻略将为你提供一些常见问题的解决方法,以及逐步介绍如何将应用上传到App Store中。 1. 提交应用前准备工作 在提交应…

    other 2023年6月26日
    00
  • element的el-form和el-table嵌套使用实现

    Element的el-form和el-table嵌套使用实现攻略 Element UI是一套基于Vue.js的组件库,其中el-form和el-table是两个常用的组件。el-form用于表单的输入和验证,el-table用于展示数据表格。本攻略将详细讲解如何嵌套使用el-form和el-table来实现复杂的表单和表格交互。 步骤一:创建el-form表…

    other 2023年7月28日
    00
  • 怎么激活DecSoft HTML Compiler 附激活教程+激活补丁

    首先,本文要说明一下,我们这里不鼓励使用非法途径获取软件的使用权。本文仅为了帮助那些已经购买了软件却不知道如何激活的用户。以下是怎样激活DecSoft HTML Complier软件的完整攻略,包含激活教程和激活补丁。 前期准备 在进行激活之前,需要确保以下两个条件: 已经安装了DecSoft HTML Compiler软件; 已经获得了该软件的许可证密钥(…

    other 2023年6月26日
    00
  • js实现右键菜单栏功能

    实现网页右键菜单栏功能一般需要用到 Javascript,可以通过两种方式来实现:自定义菜单和浏览器默认菜单。 自定义菜单 自定义菜单可以通过 JavaScript 代码,动态生成菜单结构,并设置菜单项的点击事件。具体实现过程如下: 给需要添加右键菜单的元素绑定 contextmenu 事件,该事件会在用户在元素上右键点击时触发。例如,在以下 HTML 代码…

    other 2023年6月27日
    00
  • Android入门教程之组件Activity的生命周期详解

    下面是对“Android入门教程之组件Activity的生命周期详解”教程的完整攻略: 一、什么是组件Activity? 组件Activity是Android应用程序的组成部分,是用户与应用程序进行交互的窗口。 二、Activity的生命周期 从整个流程来看,Activity的生命周期可以分为四种状态:运行状态、暂停状态、停止状态、销毁状态。这四种状态对应着…

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