3

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

客户端代码: 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

4 回答 4

10
socket.receive(packet);
byte[] data = new byte[packet.getLength()];
System.arraycopy(packet.getData(), packet.getOffset(), data, 0, packet.getLength());
于 2013-10-11T07:51:07.007 回答
4

DatagramPacket.getLength()返回接收到的数据包的实际长度。除非您使用非零偏移创建数据包,否则这意味着数据位于{0..getLength()-1}.

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

于 2011-11-23T00:19:13.003 回答
1

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

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

于 2011-11-22T15:43:28.793 回答
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可以在这里找到:如何重新初始化数据包的缓冲区?

于 2011-11-26T17:05:58.540 回答