【问题标题】:writeUTF not working :/writeUTF 不工作:/
【发布时间】:2013-11-04 20:49:39
【问题描述】:

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

谢谢:)

Client.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);
        ...

Server.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();
...

【问题讨论】:

  • 您在拍摄字节快照后添加文件名,因此它不会在 data 中,但即使是,它也会在结尾,而不是开头所以以您的方式阅读它无济于事。为什么不按照你阅读的方式开始写呢?

标签: java sockets udp


【解决方案1】:

您将文件内容写入bos 并将其转换为字节数组。所以你现在在data 中获得了文件内容。您将流转换为字节数组后将file 写入bos,因此不包括文件名。在将实际文件内容写入bos之前调用writeUTF

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);

【讨论】:

  • 在 dos.writeUTF(file) 是 //Setting up DatagramSocket DatagramPacket packet = new DatagramPacket(data, data.length, address, port); socket.send(packet); 之后我忘记发了
  • 不工作,服务器仍在等待那个字符串:/ 所以,我们把字符串的字节放在第一位,然后是文件数据,这对我来说很有意义,谢谢 :) 现在,我必须了解为什么它不读取服务器的字符串:s
  • 服务器收到包了吗?
  • 不,我用 if (socket.receive(packet)) System.out.println("received");并且服务器仍然显示 Waiting Client...
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多