【问题标题】:Clear Datagram Buffer in Java在 Java 中清除数据报缓冲区
【发布时间】:2013-07-09 13:17:23
【问题描述】:

所以我从互联网上得到了这个简单的 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);
                }
       }
 }

【问题讨论】:

    标签: java udp buffer byte


    【解决方案1】:

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

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

    您在服务器中正确执行此操作,但在客户端中没有。

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

    【讨论】:

    • DatagramPacket.setLength()?
    • @user1440061 您通过以下方式重置长度:receivePacket.setLength(receiveData.getLength())
    • @Chris.Jenkins 你的意思是receivePacket.setLength(receiveData.length)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2012-10-12
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    相关资源
    最近更新 更多