Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.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 Io - Fatal编程技术网

文件传输中的数据丢失-JAVA?

文件传输中的数据丢失-JAVA?,java,file-io,Java,File Io,我有一个文件服务器和一个文件客户端,当客户端连接时,服务器发送一个文件。这是一个简单的程序,只是为了理解背后的概念 我能够将文件从服务器发送到客户端,缓冲区为1024。 问题是接收到的文件总是比原始文件少0.01 MB左右。因此,mp3文件会丢失一些信息,视频文件无法播放 我在服务器和客户端的while循环中都放了一些prinln语句。我发现我的服务器没有发送整个文件 //Server byte [] mybytearray = new byte [1024]; FileI

我有一个文件服务器和一个文件客户端,当客户端连接时,服务器发送一个文件。这是一个简单的程序,只是为了理解背后的概念

我能够将文件从服务器发送到客户端,缓冲区为1024。 问题是接收到的文件总是比原始文件少0.01 MB左右。因此,mp3文件会丢失一些信息,视频文件无法播放

我在服务器和客户端的while循环中都放了一些prinln语句。我发现我的服务器没有发送整个文件

  //Server
  byte [] mybytearray  = new byte [1024];    
  FileInputStream fis = new FileInputStream(myFile);
  BufferedInputStream bis = new BufferedInputStream(fis);
  bis.read(mybytearray,0,mybytearray.length);
  OutputStream os = sock.getOutputStream();
  System.out.println("Sending...\n mybytearray length:"+mybytearray.length+"file   length:"+(int)myFile.length());
  int read, readTotal=0;
  while ((read = fis.read(mybytearray,0,mybytearray.length)) != -1) { 

      os.write(mybytearray, 0, read);
      System.out.println("File REad:"+read+"readtotal:"+readTotal); //*
      readTotal += read;
}
  System.out.println("Final File Read:"+read+" Final readtotal:"+readTotal);
  os.flush();
  sock.close();
  } 
Println语句输出为:

Sending...
mybytearray length:1024file length:12767554
File REad:1024readtotal:0
File REad:1024readtotal:1024
.............and a lot of it...and then
File REad:1024readtotal:12756992
File REad:1024readtotal:12758016
File REad:322readtotal:12759040
Final File Read:-1 Final readtotal:12759362
文件长度:12767554和上次读取总计:12759362应该相等。我不明白为什么上次读取的值更低[322],而它仍然可以有1024

任何形式的帮助都将不胜感激。 谢谢

[编辑]

//Client
int read;
int totalRead = 0;

while ((read = is.read(mybytearray,0,mybytearray.length)) != -1) {
        bos.write(mybytearray, 0 , read);

        totalRead += read;
        System.out.println("\nread:"+read+"\ntotalread: "+totalRead);
}
System.out.println("Final File Read:"+read+" Final readtotal:"+totalRead);
bos.write(mybytearray, 0 , read);  //57 Line in FileClient.java
bos.flush();
我再次尝试发送一个文件。这次是一个txt。 这是我的服务器的输出

Sending...
mybytearray length:1024file length:1232
File REad:1024readtotal:0
File REad:208readtotal:1024
Final File Read:-1 Final readtotal:1232
这是客户机上的

read:208
totalread: 1232
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
   Final File Read:-1     Final readtotal:1232

at java.lang.System.arraycopy(Native Method)
at java.io.BufferedOutputStream.write(Unknown Source)
at FileClient.main(FileClient.java:57)
readtotal值是相同的,但有时会出现此错误,有时不会

[大编辑--完整的客户端代码]

public class FileClient{
 public static void main (String [] args ) throws IOException {

long start = System.currentTimeMillis();
int bytesRead;
int current = 0;
final JFrame f = new JFrame("Sample");
f.getContentPane().setLayout(new FlowLayout());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(590,490);
f.setVisible(true);
// localhost for testing
Socket sock = new Socket("localhost",13267);
System.out.println("Connecting...");
File f1=new File(RecieveObject(sock));


// receive file
byte [] mybytearray  = new byte [1024];
InputStream is = sock.getInputStream();


FileOutputStream fos = new FileOutputStream(f1);
ProgressMonitorInputStream nn= new ProgressMonitorInputStream(f,"reading",is);
BufferedOutputStream bos = new BufferedOutputStream(fos);
 /*   bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;


do {
   bytesRead =
      is.read(mybytearray, current, (mybytearray.length-current));
   System.out.println("mybytesarray length: "+mybytearray.length+"\ncurrent:"+current+"\nbytesread: "+bytesRead);
   if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);

bos.write(mybytearray, 0 , current);
bos.flush();
 */
int read;
int totalRead = 0;
//InputStream clientInputStream = clientSocket.getInputStream();
while ((read = is.read(mybytearray,0,mybytearray.length)) != -1) {
        bos.write(mybytearray, 0 , read);

        totalRead += read;
        System.out.println("\nread:"+read+"\ntotalread: "+totalRead);
}
System.out.println("Final File Read:"+read+" Final readtotal:"+totalRead);
 //   bos.write(mybytearray, 0 , read);
bos.flush();
long end = System.currentTimeMillis();
System.out.println(end-start);
bos.close();
sock.close();

}
public static  String RecieveObject(Socket s) {
    String str = null;
    try{
    ObjectInputStream is = new ObjectInputStream(s.getInputStream());



            str =(String)is.readUTF();


    }
    catch(IOException ex){}
    return str;
}   

}由于您的第5行(包括注释),您缺少文件的开头(最多1024个字节)。您读取输入并将其升级,而不将其发送到客户端。删除此项:

bis.read(mybytearray,0,mybytearray.length);
此外,在循环中没有使用
BufferedInputStream
。在此处使用
bis.read
而不是
fis.read
(如果您仍然需要缓冲读取)-或者一起删除
BufferedInputStream


另一个问题是,您正在读取客户端上的最后字节,然后再次进入循环<代码>为。再次调用read。它没有返回-1,而是在套接字的另一侧关闭时抛出一个
IOException
。因此,不会调用bos.flush()和bos.close(),也不会将最后的字节写入磁盘。要帮助完成此操作,请在关闭前尝试调用
sock.shutdownOutput
。不管怎样,您都需要为此添加一些适当的异常处理。

是的,我想我缺少了文件的开头部分,只听了mp3文件rcvd。我试试看。@NikharSharma-您的
readTotal
是否仍然显示不一致?丢失的字节是否可能是由于客户端代码(可能是由于与此处类似的问题)而不是服务器代码造成的?也许你也可以发布客户代码?我正在包括我的客户代码,请看一下,客户端和服务器上的最后一个readTotal是相等的。@NikharSharma-
readTotal
在客户端和服务器上显示为相等的-但是假设它们都比文件的实际大小小6KB是正确的吗?让我们看看我发送的视频文件的大小,是41046 KB,传输后现在是41040 KB。我不知道6 KB到哪里去了?在客户端上删除第57行后,我没有收到任何错误,但传输后文件仍丢失6 KB。如果原始问题已得到回答,您可能希望在上次编辑后提出新问题。一个是具体的,指出有问题的代码(第57行在哪里?)实际上是同一个还没有解决的问题,所以我不应该创建一个新的。。。。第57行是客户端代码中的bos.write after while循环。刚刚删除了它,我没有收到错误,但我仍然丢失了大约6KB或有时4KB的数据??问题已经解决了,我用try/catch包围了代码。它与我使用的prev一样工作,这次没有数据丢失,正好得到41046 KB,但这是暂时的,现在我又丢失了一些KB,我已经删除了ProgressMonitor(虽然它不工作),现在我将从客户端/服务器删除ObjectXXXXXXStreams,然后检查?
byte [] mybytearray  = new byte [1024];    
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
OutputStream os = sock.getOutputStream();
System.out.println("Sending...\n mybytearray length:"+mybytearray.length+"filelength:"+(int)myFile.length());
int read, readTotal=0;
while ((read = bis.read(mybytearray,0,mybytearray.length)) != -1) { 
    os.write(mybytearray, 0, read);
    System.out.println("File REad:"+read+"readtotal:"+readTotal); //*
    readTotal += read;
}
System.out.println("Final File Read:"+read+" Final readtotal:"+readTotal);
os.flush();
sock.close();
}