Java Socket编程之基于UDP协议通信

1.说明

Socket(套接字)是计算机网络编程中用于实现网络通信的一种编程接口或抽象概念。
它提供了一种标准的接口,使应用程序能够通过网络与其他计算机进行通信。
Socket可以看作是应用程序与网络之间的一个通信端点,类似于电话中的插座。
通过Socket,应用程序可以创建、连接、发送和接收数据,以实现网络通信。
Socket通常使用TCP/IP协议栈作为底层网络协议,
但也可以与其他协议一起使用,
如UDP(User Datagram Protocol)和ICMP(Internet Control Message Protocol)等。

Java中基于UDP协议实现网络通信的类:

  • DatagramPacket数据包类
  • DatagramSocket端到端通信的类

服务端和客户端都使用DatagramSocket进行通信,
只是使用的细节上面有些区别。

2.服务端编程

服务端使用DatagramSocket编程步骤:

  1. 创建DatagramSocket对象,绑定监听端口
  2. 通过receive()方法监听客户端请求
  3. 通过send()方法向客户端发送响应信息
  4. 关闭相关资源
package edu.java.net.socket.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 *UDP Socket 套接字服务端
 */
public class DatagramSocketServer {
    public static void main(String[] args) throws Exception {
        // 1.创建UDP服务器端,指定监听端口
        DatagramSocket socket = new DatagramSocket(10085);
        // 2.创建数据包,用于接收客户端发送的数据
        byte[] reqData = new byte[1024];
        DatagramPacket reqPacket = new DatagramPacket(reqData, reqData.length);
        // 3.接受客户端发送的数据
        // 此方法阻塞直到接收到数据
        System.out.println("服务端已经启动...");
        socket.receive(reqPacket);

        // 4.读取数据
        String info = new String(reqPacket.getData(), 0, reqPacket.getLength());
        System.out.println("服务端接收到消息:" + info);

        // 5.向客户端响应数据
        // 获取客户端的地址,端口号
        InetAddress address = reqPacket.getAddress();
        int port = reqPacket.getPort();
        // 要返回客户端的数据
        byte[] rspData = "欢迎您访问服务端!".getBytes();
        // 创建数据报,包含响应的数据信息
        DatagramPacket rspPacket = new DatagramPacket(rspData, rspData.length, address, port);
        socket.send(rspPacket);

        // 6.关闭资源
        socket.close();
    }
}

3.客户端编程

客户端使用Socket编程步骤:

  1. 创建DatagramSocket对象
  2. 创建DatagramPacket对象,指定服务端IP和端口及要发送的数据
  3. 通过send()方法向服务端发送请求信息
  4. 通过receive()方法监听服务端的响应消息
  5. 关闭相关资源
package edu.java.net.socket.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 *UDP Socket 套接字客户端
 */
public class DatagramSocketClient {
    public static void main(String[] args) throws Exception {
        // 1.设置服务端的地址,端口号
        InetAddress address = InetAddress.getByName("localhost");
        int port = 10085;
        // 2.创建发送的数据包
        byte[] sendData = "我是admin用户".getBytes();
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port);
        // 3.创建DatagramSocket对象,向服务器发送数据
        DatagramSocket socket = new DatagramSocket();
        socket.send(sendPacket);

        // 4.创建接收数据报,用于接受服务器端响应数据
        byte[] receiveData = new byte[1024];
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        socket.receive(receivePacket);
        String reply = new String(receivePacket.getData(), 0, receivePacket.getLength());
        System.out.println("客户端收到服务端消息:" + reply);

        // 5.关闭资源
        socket.close();
    }
}

4.服务端多线程编程

实际场景中,一个服务端往往可以支持多个客户端的连接,为多个客户端提供服务。

请参考Java UDP实现一个聊天工具的示例代码

你可能感兴趣的:(java,udp,开发语言)