0

我正在编写一个使用 DatagramSocket (UDP) 发送文件的客户端,但首先我们需要使用 writeUTF() 将文件名发送到服务器。客户端和服务器都编译和运行没有任何错误,但文件名似乎永远不会到达服务器。知道会发生什么吗?我在下面发布代码...

谢谢 :)

客户端.java

     ...
                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
                    byte[] buf = new byte[1024];

                    for (int readNum; (readNum = fis.read(buf)) != -1;)
                    {
                        bos.write(buf, 0, readNum); //no doubt here is 0
                    } 

                    // File data
                    byte[] data = bos.toByteArray();

                    DataOutputStream dos = new DataOutputStream(bos);
                                //file is a String with the name of the file
                    dos.writeUTF(file);
//Setting up DatagramSocket
            DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
            socket.send(packet);
        ...

服务器.java

...
        almacen = new byte[MAXNOMBREFICHERO + 2];
        packet = new DatagramPacket( almacen, almacen.length );

    System.out.println("\nWaiting client...");
    socket.receive(packet);
    dirIPClient = packet.getAddress();
        clientPort = packet.getPort();

    ByteArrayInputStream bais = new ByteArrayInputStream( almacen );
    DataInputStream dis = new DataInputStream( bais );

        filename = dis.readUTF();
...
4

2 回答 2

0

您将文件内容写入bos并将其转换为字节数组。所以你现在得到了文件内容data。您在将流转换为字节数组后写入filebos因此不包括文件名。在将实际文件内容writeUTF写入bos.

ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);

// file is a String with the name of the file
dos.writeUTF(file);

byte[] buf = new byte[1024];
for (int readNum; (readNum = fis.read(buf)) != -1;) {
    dos.write(buf, 0, readNum);
}

// Packet data
byte[] data = bos.toByteArray();

// Setting up DatagramPacket
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
socket.send(packet);
于 2013-11-04T20:52:21.483 回答
0

您永远不会dos通过网络发送内容。dos已连接到,bos因此写入的任何内容都dos将转到byte[]与之bos关联的。此外,您在调用...bos 之前提取了...的内容,writeUTF这不是实时连接;这是一次性的事情。因此,通过在提取数组内容后调用writeUTF,您可以确保file不会在该数组中。如果您调用writeUTF然后调用bos.toByteArray()您将在数组中获得文件名(但它将在数组中的最后一个,而不是第一个)。

于 2013-11-04T21:07:32.793 回答