Java之UDP编程浅析

本文展示了如何使用Java实现UDP协议的简单客户端和服务器。客户端创建数据并发送到指定IP和端口,服务器则监听特定端口接收数据,并打印接收到的信息。通过`DatagramSocket`和`DatagramPacket`类,无需建立连接即可进行数据交换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. UDP协议发送数据:

  1.  创建发送端socket对象
  2.  创建数据并把数据打包
  3.  调用socket对象的发送方法发送数据包
  4.  释放资源

二. UDP协议接收数据:

  1. 创建发送端socket对象(需要指定端口)
  2. 创建一个数据包(接收容器) 
  3. 调用socket对象的接收方法接收数据
  4. 解析数据并显示在控制台
  5. 释放资源

UDP协议不需要建立连接,实例如下:

 

public class UdpServer {

    public static void main(String[] args) {
        try {
            DatagramSocket datagramSocket = new DatagramSocket(10000);
            byte[] buf = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);
            while (true) {
                datagramSocket.receive(datagramPacket);
                System.out.println("ip:" + datagramPacket.getAddress().getHostAddress());
                System.out.println("接收信息:" + new String(datagramPacket.getData(), 0, datagramPacket.getLength()));
            }
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
public class UdpClient {

    public static void main(String[] args) {
        try {
            DatagramSocket datagramSocket = new DatagramSocket();
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("请输入:");
            String line = null;
            while ((line = reader.readLine()) != null) {
                byte[] bytes = line.getBytes();
                DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 10000);
                // 发送数据
                datagramSocket.send(datagramPacket);
                datagramSocket.close();
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
public class UdpUtil {

    public DatagramSocket socketServer = null;

    private String ip;

    private int serverPort;

    public UdpUtil() {
    }

    public UdpUtil(int serverPort) {
        this.serverPort = serverPort;
    }

    public UdpUtil(String ip, int serverPort) {
        this.ip = ip;
        this.serverPort = serverPort;
    }

    public void connect() throws Exception {
        try {
            if (socketServer != null) {
                socketServer.close();
            }
            socketServer = new DatagramSocket(serverPort);
            socketServer.setReceiveBufferSize(1024 * 200);
            System.out.println("UDPServer connect success.");
        } catch (Exception e) {
            if (socketServer != null) {
                socketServer.close();
                socketServer = null;
            }
            throw new Exception("Connect failed. " + e.getMessage());
        }
    }

    public void connect(int port) throws Exception {
        try {
            if (socketServer != null) {
                socketServer.close();
            }
            socketServer = new DatagramSocket(port);
            socketServer.setReceiveBufferSize(1024 * 200);
            System.out.println("UDPServer connect success.");
        } catch (SocketException e) {
            if (socketServer != null) {
                socketServer.close();
                socketServer = null;
            }
            throw new Exception("Connect failed." + e.getMessage());
        }
    }

    public DatagramPacket collectDatagramPacket(int dataLength) throws IOException {
        byte[] data = new byte[dataLength];
        DatagramPacket dPacket = new DatagramPacket(data, dataLength);
        socketServer.receive(dPacket);
        return dPacket;
    }

    public byte[] collect(int dataLength) throws IOException {
        byte[] data = new byte[dataLength];
        DatagramPacket dPacket = new DatagramPacket(data, dataLength);
        socketServer.receive(dPacket);
        return data;
    }

    public byte[] collect(int dataLength, String ip1, String ip2) throws Exception {
        byte[] data = new byte[dataLength];
        DatagramPacket dPacket = new DatagramPacket(data, dataLength);
        socketServer.receive(dPacket);
        if (ip1 != null || ip2 != null) {
            if (dPacket.getAddress().getHostAddress().equals(ip1) || dPacket.getAddress().getHostAddress().equals(ip2)) {
                return data;
            } else {
                return null;
            }
        } else {
            return data;
        }
    }

    public void send(DatagramPacket datagramPacket) throws Exception {
        socketServer.send(datagramPacket);
    }

    public void send(byte[] data) throws IOException {
        DatagramPacket datagramPacket = new DatagramPacket(data, data.length, InetAddress.getByName(ip), serverPort);
        socketServer.send(datagramPacket);
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值