You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java DatagramSocket问题:客户端仅接收响应的第一个字符

Java UDP通信问题:客户端仅接收部分响应字符

问题根源

客户端输出单个字符(如"T")的核心原因是接收缓冲区长度限制+未正确截取实际接收的有效字节数:

  • 客户端发送第二个加数后,buf被替换为该加数的字节数组,其长度仅等于加数字符串的长度(例如输入12时,buf长度为2)。
  • 构造接收数据包时复用了这个长度有限的buf,导致服务器返回的完整响应(如Result 25)被截断为buf长度的字节。
  • 转换字符串时直接调用new String(packet.getData()),未通过packet.getLength()获取实际接收的有效字节数,最终输出的是截断后的部分内容。

修复方案

修改客户端接收逻辑,使用独立的足够大的缓冲区,并基于实际接收字节数转换字符串:

修复后的客户端代码

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client{

    public static void main(String[] args) throws IOException{
        int add1, add2;
        Scanner scan = new Scanner(System.in);
        try {
            InetAddress address = InetAddress.getLocalHost();
            DatagramSocket socket = new DatagramSocket();
            
            // 发送第一个加数
            System.out.println("First adder");
            add1 = scan.nextInt();
            byte[] sendBuf1 = String.valueOf(add1).getBytes();
            DatagramPacket packet = new DatagramPacket(sendBuf1, sendBuf1.length, address, 8189);
            socket.send(packet);
            
            // 发送第二个加数
            System.out.println("Second adder");
            add2 = scan.nextInt();
            byte[] sendBuf2 = String.valueOf(add2).getBytes();
            packet = new DatagramPacket(sendBuf2, sendBuf2.length, address, 8189);
            socket.send(packet);
            
            // 接收响应:使用独立的大缓冲区
            byte[] receiveBuf = new byte[256];
            packet = new DatagramPacket(receiveBuf, receiveBuf.length);
            socket.receive(packet);
            // 仅转换实际接收的有效字节
            String response = new String(packet.getData(), 0, packet.getLength());
            System.out.println(response);
            
            socket.close();
        } catch (SocketException | UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

额外优化建议

  • 服务器端建议添加NumberFormatException捕获逻辑,避免客户端发送非数字数据导致程序崩溃。
  • UDP为无连接协议,可在客户端添加超时设置(socket.setSoTimeout(3000)),防止程序无限等待响应。

内容的提问来源于stack exchange,提问作者BeArt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 20:42:06