浅谈Java和C#UDP通信

Java UDP高级用法示例

1. 多线程UDP服务器
java 复制代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiThreadedUDPReceiver implements Runnable {
    private int port;
    private ExecutorService executorService;

    public MultiThreadedUDPReceiver(int port, int numberOfThreads) {
        this.port = port;
        this.executorService = Executors.newFixedThreadPool(numberOfThreads);
    }

    @Override
    public void run() {
        DatagramSocket socket = null;
        try {
            socket = new DatagramSocket(port);
            byte[] buffer = new byte[1024];
            while (true) {
                DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                socket.receive(packet);
                String message = new String(packet.getData(), 0, packet.getLength());
                System.out.println("Message received: " + message);
                executorService.submit(() -> processMessage(message));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (socket != null && !socket.isClosed()) {
                socket.close();
            }
            if (!executorService.isShutdown()) {
                executorService.shutdown();
            }
        }
    }

    private void processMessage(String message) {
        System.out.println("Processing message: " + message);
    }

    public static void main(String[] args) {
        int port = 9876;
        int numberOfThreads = 4;
        Thread receiverThread = new Thread(new MultiThreadedUDPReceiver(port, numberOfThreads));
        receiverThread.start();
    }
}
2. 带校验和的UDP数据传输
java 复制代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPChecksumExample {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket();
        InetAddress address = InetAddress.getByName("localhost");
        int port = 9876;

        // 发送端:添加校验和
        String message = "Hello, UDP!";
        byte[] data = message.getBytes();
        int checksum = calculateChecksum(data);
        byte[] checksumBytes = intToBytes(checksum);
        byte[] buffer = new byte[data.length + checksumBytes.length];
        System.arraycopy(data, 0, buffer, 0, data.length);
        System.arraycopy(checksumBytes, 0, buffer, data.length, checksumBytes.length);

        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, port);
        socket.send(packet);

        // 接收端:校验数据完整性
        byte[] receiveBuffer = new byte[1024];
        DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
        socket.receive(receivePacket);

        byte[] receivedData = new byte[receivePacket.getLength() - 4];
        byte[] receivedChecksumBytes = new byte[4];
        System.arraycopy(receivePacket.getData(), 0, receivedData, 0, receivePacket.getLength() - 4);
        System.arraycopy(receivePacket.getData(), receivePacket.getLength() - 4, receivedChecksumBytes, 0, 4);

        int receivedChecksum = bytesToInt(receivedChecksumBytes);
        int calculatedChecksum = calculateChecksum(receivedData);

        if (receivedChecksum == calculatedChecksum) {
            System.out.println("Data integrity verified.");
        } else {
            System.out.println("Data corruption detected.");
        }

        socket.close();
    }

    private static int calculateChecksum(byte[] data) {
        int checksum = 0;
        for (byte b : data) {
            checksum += b;
        }
        return checksum;
    }

    private static byte[] intToBytes(int value) {
        return new byte[]{
                (byte) (value >> 24),
                (byte) (value >> 16),
                (byte) (value >> 8),
                (byte) value
        };
    }

    private static int bytesToInt(byte[] bytes) {
        return (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3];
    }
}

C# UDP高级用法示例

1. 异步UDP服务器
cs 复制代码
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

class AsyncUdpServer
{
    private const int Port = 5000;

    static async Task Main(string[] args)
    {
        using (UdpClient udpClient = new UdpClient(Port))
        {
            Console.WriteLine("UDP Server is running...");
            while (true)
            {
                try
                {
                    UdpReceiveResult result = await udpClient.ReceiveAsync();
                    string receivedData = Encoding.UTF8.GetString(result.Buffer);
                    Console.WriteLine($"Received data from {result.RemoteEndPoint}: {receivedData}");

                    string responseData = "Message received!";
                    byte[] sendBytes = Encoding.UTF8.GetBytes(responseData);
                    await udpClient.SendAsync(sendBytes, sendBytes.Length, result.RemoteEndPoint);
                }
                catch
相关推荐
ZWZhangYu3 分钟前
从 Dify 实践理解大模型上下文缓存
java·后端·spring
小熊恋旧7 分钟前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
云边云科技_云网融合8 分钟前
面向汽车零部件制造业场景的解决方案 | 70 秒:一台车下线的时间里,藏着五张网
开发语言·汽车·php
Evand J8 分钟前
【PMSM滤波例程2】PMSM未知负载转矩观测EKF。MATLAB例程(负载增广EKF与实际仿真结果)。附下载链接
开发语言·matlab·电机
小羊没烦恼!28 分钟前
关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁
java·服务器·网络·学习·负载均衡
will_net29 分钟前
apollo 站点部署&C#接入
开发语言·c#·apollo
晗夜未央1 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
熊猫钓鱼>_>1 小时前
四种书签,一条时间线:一个读书 App 的记忆颗粒与它的边界案例【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙pc
Fuyo_11192 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
努力努力再努力wz2 小时前
【Lua 入门系列】Lua 函数深入理解:函数对象、多返回值、可变参数、闭包、递归与尾调用优化
开发语言·lua