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
相关产品推荐
相关产品推荐

