0

我正在编写一个 UDP 客户端来将文件传输到 UDP 服务器。首先,我尝试测量文件的长度,除以 UDP 数据包中要发送的缓冲区长度,得到需要发送的数据包数。我首先将此号码发送到服务器以确认它。但是在服务器端,从接收数据包的字节数组到初始数字的转换失败了。谁能帮我解决这个问题?这是我在客户端的代码:

    DatagramSocket socket=new DatagramSocket(); 
    File f = new File(filename);
long fileSize = f.length();
    byte[] buffer = new byte[16384]; 
    long packetNumber = (fileSize/(buffer.length))+1;
    DatagramPacket sendPacket=new DatagramPacket(buffer,buffer.length,addr,srvPort);
    String str=Long.toString(packetNumber);
    buffer = str.getBytes();
    socket.send(sendPacket);

这是服务器端的代码:

    DatagramSocket socket=new DatagramSocket(port);     
byte[] buffer=new byte[16384];
    DatagramPacket receivePacket=new DatagramPacket(buffer, buffer.length);
    while(true)
        {
        socket.receive(receivePacket);
        if (receivePacket.getData().toString().trim()!=null)            
        {

        String str=receivePacket.getData().toString();
        System.out.println(str);
        long pcount=Long.parseLong(str);
                    System.out.println(pcount+" packets to be received.");
                    break;
                    }
                    }

但是在服务器端,变量 pcount 总是无法解析,当我尝试打印 str 时,它会写出一些“[B@60991f”或……,很奇怪。

4

2 回答 2

1

你收到一个byte array,使用 toString() 不会给你任何东西。您应该使用从字节数组重建字符串new String

于 2012-06-04T09:31:18.637 回答
1

这段代码没有任何意义。

大多数网络不允许您可靠地发送超过 534 字节的数据报。

目前您正在发送 16384 个字节的零值,因为您没有将任何内容放入缓冲区:而是在创建 DatagramPacket后创建一个新缓冲区。所以你还没有发送任何东西。

你也没有收到任何东西。String.trim() 的结果不能为空。您必须在每次 receive() 之前重置 DatagramPacket 中的字节数组,因为它会缩小到实际接收到的数据包的大小,所以除非您重置它,否则它会越来越小。toString() 对字节数组的结果不包括其内容,因此解析它是徒劳的。

您需要学习几个基本的 Java 编程概念:太多了,无法在这里回答。

于 2012-06-04T09:42:02.377 回答