当前位置: 首页 > 知识库问答 >
问题:

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

汪弘光
2023-03-14

我有客户端服务器聊天

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

我正在使用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个答案

姚实
2023-03-14

你正在使用两种复制技术,它们都是错误的。

第一:

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

在这里,您假设:

  1. 文件适合内存。
  2. 文件长度适合整数
  3. read() 填充缓冲区。

这些假设都不是有效的。

第二:

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

给你:

    < li >使用一个字节的小得可笑的缓冲区。 < li >如果文件长度为零,则写入额外的字节。 < li >使用< code>do/while,在这种情况下自然需要< code > while (99.99%的情况都是这样),因此: < li >使用两个< code>read()调用,并且只正确检查其中一个调用的结果。 < li >无意义地使用< code > ByteArrayOutputStream ,如上所述,它假定文件适合内存,并且其大小适合< code>int。它还毫无意义地增加了延迟。

把它们都扔掉,在两端使用它:

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

其中:

  • 中的在发送文件时是FileInputStream,在接收文件时是套接字输入流
  • out在接收文件时是FileOutputStream,在发送文件时是套接字输出流

 类似资料:
  • 我是java的新手,我制作了一个聊天应用程序,客户端和服务器可以通过它发送和接收消息,现在我试图从客户端向服务器发送一个文件,但在服务器接收到文件后,客户端和服务器都无法发送消息,下面是代码: 客户端: 服务器端:

  • 我需要在netty中有一个客户机/服务器通信,用于我的项目目的之一。所以我刚开始用一个handsOn来改进,我正在学习netty,我是一个初学者。 我尝试了一个简单的客户端服务器与Netty聊天。 客户端和服务器正在初始化,我可以看到服务器能够获得用于建立连接的客户端管道,但是当客户端发送消息时,它没有进入ServerAdapterHandler的messageReceived部分。下面是我的源代

  • 问题内容: 我应该为“ .thrift”文件定义哪种服务,以便以后将其用于我的程序? 此文件传输应该在客户端和服务器之间,并且应该是“部分”。 StreamFileService.thrift: StreamFileClient.java: } StreamFileServer.java: } StreamFileServiceImpl: } 问题答案: 您的代码对我来说似乎还不错(未经测试),没

  • 问题内容: 我正在尝试在服务器和客户端之间进行文件传输,但是工作非常糟糕。基本上需要发生的是: 1)客户端将txt文件发送到服务器(我称为“ quotidiani.txt”) 2)服务器将其保存在另一个txt文件中(“ receive.txt”) 3)服务器运行脚本上对其进行修改并以其他名称保存(“ output.txt”)的脚本 。4)服务器将文件发送回客户端,客户端以相同的名称(final.t

  • 我一直在努力通过Smack和Openfire服务器与XMPP聊天。我的问题如下: 每当一个用户向另一个用户发送消息时,该消息就会在另一个用户处正确接收。但是任何回复都不会出现在第一条消息的发件人处。因此,用户1成功地发送给用户2。然后,用户2无法向用户1发送任何回复。另一方面,如果我重新启动并让用户再次登录,则用户2可以发送给用户1,但反之亦然。 我想说的是,只有聊天的发起者才能发送消息,接收者不

  • 我已经实现了一个通过套接字进行通信的全局聊天。客户端写入一条消息,发送到服务器,然后服务器将消息发回给所有客户端。每个客户端都由一个名为ClientThread的类表示,因此每个客户端都是一个线程。每次新客户端连接时,我都会创建一个新的ClientThread实例,并将所有这些实例存储在列表中。现在我想实现一个私人聊天,这样每个客户端就可以私下与另一个客户端交谈(或者2,3或更多的群聊)。 我还想