当前位置: 首页 > 面试题库 >

带套接字的大文件传输

牧飞鹏
2023-03-14
问题内容

当我使用套接字编程传输大文件时,收到的文件不完整,即它是一个mp3文件,当我播放时听起来很奇怪。代码是:

服务器端:

File myFile = new File("abc.mp3");
{
    Socket sock = servsock.accept();
    int packetsize=1024;
    double nosofpackets=Math.ceil(((int) myFile.length())/packetsize);
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
    for(double i=0;i<nosofpackets+1;i++) {
        byte[] mybytearray = new byte[packetsize];
        bis.read(mybytearray, 0, mybytearray.length);
        System.out.println("Packet:"+(i+1));
        OutputStream os = sock.getOutputStream();
        os.write(mybytearray, 0,mybytearray.length);
        os.flush();
    }
}

客户端:

int packetsize=1024;
FileOutputStream fos = new FileOutputStream("zz.mp3");
BufferedOutputStream bos = new BufferedOutputStream(fos);
double nosofpackets=Math.ceil(((int) (new File("abc.mp3")).length())/packetsize);
for(double i=0;i<nosofpackets+1;i++)
{
    InputStream is = sock.getInputStream();
    byte[] mybytearray = new byte[packetsize];
    int bytesRead = is.read(mybytearray, 0,mybytearray.length );
    System.out.println("Packet:"+(i+1));
    bos.write(mybytearray, 0,mybytearray.length);
}
sock.close();
bos.close();

在客户端,我new File("abc.mp3")).length只是为了简化而使用(我可以从服务器端发送文件的长度)。

如果客户端和服务器是同一台机器,则此代码可以完美地工作,但是如果它们位于不同的机器上,则文件会失真。


问题答案:

在Java中复制流的规范方法:

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

适用于大于零的任何缓冲区大小。应避免避免将缓冲区大小与输入大小相关联的诱惑。



 类似资料:
  • 问题内容: 我正在尝试在C中创建一个多线程服务器- 客户端文件传输系统。有些客户端将发送或列出或做其他选择(在交换机的情况下,您可以看到),而服务器则存储文件并提供大量服务客户。 就我所知,多线程意识形态确实很困难。它需要太多的经验而不是知识。我已经在该项目上工作了一个多星期,但我一直无法解决这些问题。 有4个选择:第一个是在其目录中列出客户端的本地文件,第二个是在客户端和服务器之间传输的列表文件

  • 这是接收文件的服务器代码 这是发送文件的客户端代码

  • 我已经检查了应用程序,一切接缝都很好(代码和应用程序配置明智),服务器,数据库也可以,在日志中我得到了这个错误,我已经看了这个Nginx找不到unix套接字文件与Unicorn(没有这样的文件或目录),但我真的不知道从哪里开始才能实现“只需修改独角兽配置文件中的监听变量。例如:听"/var/套接字/Unicorn.[应用程序名称]. sock",然后配置Nginx来代理服务器到该套接字文件的所有连

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

  • 问题内容: 我有工作的服务器和客户端应用程序,它们在发送小文件时可以完美工作,但是当我尝试通过套接字发送例如700mb的电影文件时,它给了我 我在互联网上搜索并找到了一些有关发送大文件的教程,但并不太了解它们,但是我认为我的麻烦在于编写文件。 这是服务器用来写入我的文件的代码: 这是我的客户用来发送文件的代码: 问题答案: 它之所以给您,是因为您试图在发送之前将整个文件读入内存。这完全是100%完

  • 在用你们的建议编辑我的代码之后,以及将代码压缩到我可以查明导致问题的代码行的位置。服务器代码:' 公共类服务器 2 { } 公共类Client2 { } 服务器输出:-------------------- 服务器已创建。 等待连接... 接受的连接:Socket[addr=/127.0.0.1, port=51565, localport=12362] 正在发送SFileToBeSent。txt