如何摆脱剩余的缓冲区?

时间:2011-11-22 15:11:28

标签: java sockets networking udp datagram

我有一个服务器客户端应用程序,它使用数据报套接字来交换消息。我最初将缓冲区大小设置为1024字节,因为我不知道消息的长度。当我发送短于1024字节的内容时,我将其余的字符串显示为一些奇怪的字符(空字符或我不确定它们是如何被调用的)。 这是一个屏幕: string buffer null characters

客户代码: byte[] buf = ("This is another packet.\n").getBytes(); DatagramPacket packet = new DatagramPacket(buf, buf.length, inetAddress, serverport); socket.send(packet)

服务器代码: byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet);

4 个答案:

答案 0 :(得分:9)

socket.receive(packet);
byte[] data = new byte[packet.getLength()];
System.arraycopy(packet.getData(), packet.getOffset(), data, 0, packet.getLength());

答案 1 :(得分:4)

DatagramPacket.getLength()返回接收数据包的实际长度。除非您使用非零offet创建数据包,否则表示数据位于{0..getLength()-1}

请注意,这意味着您创建的DatagramPacket原始长度已丢失,这反过来意味着您必须每次接收使用新的DatagramPacket,或者至少重新初始化其数据缓冲区通过setData()。否则,DatagramPacket将缩小到收到的最小数据包的大小。

答案 2 :(得分:1)

您必须检查packet.getOffset()以查找缓冲区中接收数据的起始位置,并packet.getLength()获取数据的长度(以字节数表示)。

您还应该考虑,如果收到的数据包太大而无法容纳在提供的缓冲区中(在您的情况下> 1024字节),则会丢弃额外的数据。除非你必须非常小心内存使用,否则你应该使用更大的缓冲区来确保整个数据包都适合。在UDP的情况下,最大数据包大小为64kB。

答案 3 :(得分:1)

好的,所以我想出了一个适合我的解决方案:

    public String getRidOfAnnoyingChar(DatagramPacket packet){
        String result = new String(packet.getData());
        char[] annoyingchar = new char[1];
        char[] charresult = result.toCharArray();
        result = "";
        for(int i=0;i<charresult.length;i++){
            if(charresult[i]==annoyingchar[0]){
                break;
            }
            result+=charresult[i];
        }
        return result;
    }

修改 使用ByteArrayOutputStream存在更好的解决方案,可在此处找到:How to reinitialize the buffer of a packet?