Проблемы с загрузкой файла в Socket Programming? Файл не загружен полностью - PullRequest
0 голосов
/ 26 мая 2011

Привет, я использую следующий код для загрузки моего файла с телефона Android на сервер, но файл загружается не полностью .. Например, я загрузил файл 11kb и получил только файл 8kb на сервере.я делаю не так?

на стороне клиента

Socket skt = new Socket"112.***.*.**", 3000);   

                String FileName=fil.getName();  

                            PrintWriter out2 = new PrintWriter(new BufferedWriter(new OutputStreamWriter(skt.getOutputStream())),true);                     
                out2.println("Upload");
                out2.println(FileName);         
                out2.println(spinindx); 
                out2.println(singleton.arrylst_setngs.get(0).toString());
                out2.println(singleton.arrylst_setngs.get(1).toString());               
                out2.println(singleton.arrylst_setngs.get(2).toString());
                out2.println(singleton.arrylst_setngs.get(3).toString());
                out2.println(singleton.arrylst_setngs.get(4).toString());

                out2.flush();
                //Create a file input stream and a buffered input stream.
                FileInputStream fis = new FileInputStream(fil);
                BufferedInputStream in = new BufferedInputStream(fis);
                BufferedOutputStream out = new BufferedOutputStream(skt.getOutputStream());

                //Write the file to the server socket           
                int i;          
                byte[] buf = new byte[512];

                while ((i = in.read(buf)) != -1) {                  
                    out.write(buf,0,i);

                    publishProgress(in.available());
                    System.out.println(i);
                }
                //Close the writers,readers and the socket.
                in.close();
                out.flush();
                out.close();                
                out2.close();               
                skt.close();
            }
            catch( Exception e ) {              
                System.out.println(e);
            }

на стороне сервера

InputStream inStream = socket.getInputStream();
                BufferedReader inm = new BufferedReader(new InputStreamReader(inStream));

                String Request=inm.readLine();  
if(Request.equals("Upload")){

                    fileName = inm.readLine();
                    chosn = inm.readLine();
                    lt=inm.readLine();
                    cs = inm.readLine();                                    
                    om = inm.readLine();
                    o = inm.readLine();
                    check=inm.readLine();                   



                    //Read, and write the file to the socket
                    BufferedInputStream in = new BufferedInputStream(inStream);         
                    int i=0;                    
                    File f=new File("D:/data/"+filePrefx+fileName);
                    if(!f.exists()){
                        f.createNewFile();

                    }
                    FileOutputStream fos = new FileOutputStream("D:/data/"+filePrefx+fileName);
                    BufferedOutputStream out = new BufferedOutputStream(fos);

                    byte[] buf = new byte[512];

                    while ((i = in.read(buf)) != -1) {
                        System.out.println(i);
                        out.write(buf,0,i);
                        System.out.println("Receiving data...");
                    }


                    in.close(); 
                    inStream.close();
                    out.close();    
                    fos.close();
                                        socket.close();

Ответы [ 3 ]

2 голосов
/ 26 мая 2011

Похоже, что вы используете и BufferedReader, и BufferedInputStream на одном и том же базовом сокете на стороне сервера, и два вида выходного потока / записи на клиенте. Таким образом, ваш BufferedReader выполняет буферизацию, что он и должен делать, и таким образом «крадет» часть данных, которые вы ожидаете прочитать с помощью BufferedInputStream. Мораль: ты не можешь этого сделать. Используйте только DataInputStream & DataOutputStream и writeUTF () / readUTF () для 8 строк, которые вы читаете с клиента перед файлом.

0 голосов
/ 26 мая 2011

Смотри, я никогда не пробовал, хотя

  void read() throws IOException {
    log("Reading from file.");
    StringBuilder text = new StringBuilder();
    String NL = System.getProperty("line.separator");
    Scanner scanner = new Scanner(new FileInputStream(fFileName), fEncoding);
    try {
      while (scanner.hasNextLine()){
        text.append(scanner.nextLine() + NL);
      }
    }
    finally{
      scanner.close();
    }
    log("Text read in: " + text);
  }

Бесстыдно скопировано с http://www.javapractices.com/topic/TopicAction.do?Id=42

0 голосов
/ 26 мая 2011

Вы использовали один и тот же базовый InputStream между вашим BufferedReader и bufferedInputStream.

Что произошло, когда вы выполняете чтение через BufferedReader, он читает больше, чем несколько строк, которые вы запрашивали из базового InputStream, в его собственный внутренний буфер. И когда вы создаете BufferedInputStream, данные уже были прочитаны BufferedReader. Таким образом, помимо того, что EJP предложил не использовать буферизованный класс, вы можете создать BufferedInputStream, а затем создать Reader поверх него. Код выглядит примерно так:

BufferedInputStream in = new BufferedInputStream(inStream);
Reader inm = new InputStreamReader(in);

Добавьте его в начало кода своего сервера и удалите эту строку:

BufferedInputStream in = new BufferedInputStream(inStream);
...