java客户端服务器聊天传输文件未正确接收

时间:2014-12-31 02:43:37

标签: java

我有我的客户端服务器聊天

客户端发送文件,服务器接收它们。但是,问题是,我不认为文件被正确接收,因为当我检查文件的大小时,我看到由于某些原因,差异已经减半!

我正在使用GUI浏览客户端中的文件,然后我向服务器发送命令以知道客户端正在发送文件。但它不起作用

这是客户端和服务器

public void sendFiles(String file)  {
        try {
            BufferedOutputStream outToClient = null;
            outToClient = new BufferedOutputStream(sock.getOutputStream());

            System.out.println("Sending file...");

            if (outToClient != null) {
                File myFile = new File( file );
                byte[] mybytearray = new byte[(int) myFile.length()];

                FileInputStream fis = null;

                fis = new FileInputStream(myFile);

                BufferedInputStream bis = new BufferedInputStream(fis);

                    this.out.println("SF");
                    bis.read(mybytearray, 0, mybytearray.length);
                    outToClient.write(mybytearray, 0, mybytearray.length);
                    this.out.flush();
                    outToClient.flush();
                    outToClient.close();

                    System.out.println("File sent!");
                    return;
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

服务器

public void recvFile() {

        try {

            byte[] aByte = new byte[1];
            int bytesRead;
            InputStream is = null;

            is = sock.getInputStream();

            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            if (is != null) {

                FileOutputStream fos = null;
                BufferedOutputStream bos = null;
                try {
                    fos = new FileOutputStream("/Users/Documents/Received.png");
                    bos = new BufferedOutputStream(fos);
                    bytesRead = is.read(aByte, 0, aByte.length);

                    do {
                        baos.write(aByte);
                        bytesRead = is.read(aByte);
                    } while (bytesRead != -1);

                    bos.write(baos.toByteArray());
                    bos.flush();
                    bos.close();
                    //                   clientSocket.close();
                } catch (IOException ex) {
                    // Do exception handling
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
}

有人可以帮我解决这个问题吗?因为我不知道如何正确发送和接收文件

谢谢

1 个答案:

答案 0 :(得分:2)

您使用的是两种复制技术,但它们都是错误的。

首先:

byte[] mybytearray = new byte[(int) myFile.length()];
bis.read(mybytearray, 0, mybytearray.length);
outToClient.write(mybytearray, 0, mybytearray.length);

这里假设:

  1. 该文件适合内存。
  2. 文件长度适合int
  3. read()填充缓冲区。
  4. 这些假设都不是有效的。

    第二

    byte[] aByte = new byte[1];
    bytesRead = is.read(aByte, 0, aByte.length);
    do {
        baos.write(aByte);
        bytesRead = is.read(aByte);
    } while (bytesRead != -1);
    

    你在这里:

    1. 使用一个字节的可笑小缓冲区。
    2. 如果文件长度为零,则写入一个额外的字节。
    3. 使用do/while情况自然需要while(99.99%的情况),因此:
    4. 使用两次read()次调用,并且只检查其中一次调用的结果。
    5. 毫无意义地使用ByteArrayOutputStream,如上所述,假设文件适合内存并且其大小适合int。它也毫无意义地增加了延迟。
    6. 将它们扔掉并在两端使用它:

      byte[] buffer = new byte[8192];
      int count;
      while ((count = in.read(buffer)) > 0)
      {
          out.write(buffer, 0, count);
      }
      

      其中:

      • in在发送文件时为FileInputStream,在接收文件时为套接字输入流。
      • out在接收文件时为FileOutputStream,在发送文件时为套接字输出流