Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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通过套接字发送文件_Java_File_Sockets_Transfer - Fatal编程技术网

Java通过套接字发送文件

Java通过套接字发送文件,java,file,sockets,transfer,Java,File,Sockets,Transfer,我正在编写一个类,用于在Java中通过套接字双向发送文件 给你。 在文件接收完成之前,一切都很好。 很快: 在client.java中,是以C:\Maven\README.txt的方式硬编码的 首先我发送文件名 然后我发送文件长度 在第三步中,我将文件从FileInputStream发送到DataOutputStream 在客户端: byte[] bytes = new byte[(int)forSend.length()]; InputStream fin = new FileInputS

我正在编写一个类,用于在Java中通过套接字双向发送文件 给你。 在文件接收完成之前,一切都很好。 很快:

  • 在client.java中,是以C:\Maven\README.txt的方式硬编码的
  • 首先我发送文件名
  • 然后我发送文件长度
  • 在第三步中,我将文件从FileInputStream发送到DataOutputStream
在客户端:

byte[] bytes = new byte[(int)forSend.length()];
InputStream fin = new FileInputStream(forSend);
int count;
while ((count = fin.read(bytes)) > 0) {
    out.write(bytes, 0, count);
}
fin.close();
  • 服务器上的文件已完全接收(长度和内容相同)
当我尝试添加代码以便在之后将某些内容写入套接字时,在启动服务器和客户端之后,它们正在等待某些内容(我不知道是什么)

以前我遇到这种情况时,丢失了一个DataInputStream读取(从服务器发送的消息,但客户端上并没有该消息的接收器)。但目前我正在尝试添加在文件传输完成后更改的标志,并在稍后检查其状态。这在服务器和客户机上都是可行的,但在套接字中添加读/写操作会让我回到服务器和客户机都在等待的情况

现在怎么了?

我的朋友帮了我,所以我的错误是控制了文件长度,我的问题中没有。正因为如此,我的“完成”确认书被写入了文件。 解决问题的方法是:

int read = 0;
int block = 8192;
int count = 0;
byte[] bytes = new byte[block];
while (read != forSend.length()) {
    count = fin.read(bytes, 0, block);
    out.writeInt(count);
    out.write(bytes, 0, count);
    read += count;
    System.out.println("already sent " + read + " bytes of " + forSend.length());
}
  • 发送方读取字节并写入字节数
  • 它将count发送给receiver,这样receiver就知道在当前循环迭代中要接收多少字节
  • 然后发送方发送字节块,并增加读取字节的计数器
  • 当计数器不等于文件长度时重复此操作
  • 在发件人中:

    int block = 8192;
    int count = 0;
    int read = 0;
    byte[] bytes = new byte[block];
    System.out.println("recieving file...");
    while (read != length) {
        block=in.readInt();
        in.readFully(bytes, 0, block);
        fout.write(bytes, 0, block);
        read += block;
        System.out.println("already recieved " + read + " bytes of " + length);
    }
    
  • 使字节数组的长度等于发送方的块长度
  • 在每次迭代中,首先读取下一个块长度,然后读取此字节计数
  • 递增接收计数器
  • 当计数器不等于先前接收的文件长度时,重复此操作

  • 在这种情况下,我们可以控制每次文件读取迭代,并且始终知道要接收多少字节,因此,当接收到的所有字节相同时,文件中的下一条“消息”将不会写入文件。

    UPD:[ENG]我已尝试将读/写移出发送功能。如果客户端是发送方,服务器是接收方,则服务器会因EOFEException而崩溃。但我不知道是什么原因。[俄罗斯]。ааааааа,аааааа,аааа,ааааааааааааа。Но не догоняю чем он вызван.
    int block = 8192;
    int count = 0;
    int read = 0;
    byte[] bytes = new byte[block];
    System.out.println("recieving file...");
    while (read != length) {
        block=in.readInt();
        in.readFully(bytes, 0, block);
        fout.write(bytes, 0, block);
        read += block;
        System.out.println("already recieved " + read + " bytes of " + length);
    }