Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java writeUTF不工作:/_Java_Sockets_Udp - Fatal编程技术网

Java writeUTF不工作:/

Java writeUTF不工作:/,java,sockets,udp,Java,Sockets,Udp,我正在编写一个使用DatagramSocket(UDP)发送文件的客户端,但首先我们需要使用writeUTF()将文件名发送到服务器。客户端和服务器都可以编译并运行,没有任何错误,但文件名似乎从未到达服务器。你知道会发生什么吗?我把代码贴在下面 谢谢:) Client.java ... ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte

我正在编写一个使用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);
        ...
...
        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();
...
Server.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);
        ...
...
        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();
...

将文件内容写入
bos
,并将其转换为字节数组。现在您在
数据中获得了文件内容。将流转换为字节数组后,您将
文件
写入
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
的内容
dos
连接到
bos
,因此写入
dos
的任何内容都将转到与
bos
关联的
字节[]
。此外,在调用
writeUTF
之前,提取
bos
的内容。。。这不是带电连接;这是一次性的事情。因此,通过在提取数组内容后调用
writeUTF
,可以确保
文件
不在该数组中。如果您调用
writeUTF
,那么
调用
bos.toByteArray()
您将在数组中拥有文件名(但它将是数组中的最后一个,而不是第一个)。

在dos之后。writeUTF(文件)是
//设置DatagramSocket DatagramPacket packet=new DatagramPacket(数据、数据.长度、地址、端口);socket.send(包)我忘了发布它不工作,服务器仍在等待该字符串:/因此,我们将字符串的字节放在第一位,然后是文件数据,这对我来说是有意义的,谢谢:)现在,我必须理解为什么它不读取该字符串服务器:服务器收到数据包了吗?不,我用if(socket.receive)更改服务器java(数据包)系统输出打印项次(“已接收”);服务器仍然显示等待的客户端…您在对字节进行快照后添加文件名,这样它就不会出现在
数据中,但即使是,它也会出现在末尾,而不是开始处,因此以您的方式读取也没有帮助。为什么不以读取方式在开始处写入它?