gpt4 book ai didi

java - 在 Java 中清除数据报缓冲区

转载 作者:搜寻专家 更新时间:2023-11-01 01:53:40 25 4
gpt4 key购买 nike

所以我从互联网上得到了这个简单的 udp 客户端/服务器代码,它可以工作。但是,当我输入的内容比我之前输入的内容短时,我会留下剩余的字符。例如,如果我首先输入:

kitty

然后输入:

cat

第二个打印内容如下:

catty

我一直在看其他有类似问题的人,大多数问题似乎都是通过清除字节数组来解决的。但是,如果我尝试实现他们的答案,它并不能解决我的问题。我需要做什么,以及(也许更重要的是)它应该放在代码中的什么位置?这是代码:

客户:

import java.io.*;
import java.net.*;

class UDPClient
{
public static void main(String args[]) throws Exception
{
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("localhost");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 20700);
clientSocket.send(sendPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String modifiedSentence = new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence);
clientSocket.close();
}
}

服务器:

import java.io.*;
import java.net.*;
import java.util.*;

class UDPServer
{
public static void main(String args[]) throws Exception
{
DatagramSocket serverSocket = new DatagramSocket(21200);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
while(true)
{
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String sentence = new String( receivePacket.getData(), 0, receivePacket.getLength());
System.out.println("RECEIVED: " + sentence);
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
String capitalizedSentence = sentence.toUpperCase();
sendData = capitalizedSentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
}
}
}

最佳答案

您不需要清除字节数组,但您需要在接收后通过getLength() 方法注意DatagramPacket 的长度;例如:

new String(packet.getData(), packet.getOffset(), packet.getLength());

您在服务器中正确地执行了此操作,但在客户端中却不正确。

您还需要在调用 receive() 之前重置长度。否则 DatagramPacket 将不断缩小到目前收到的最小数据包的长度。

关于java - 在 Java 中清除数据报缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17549195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com