微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

套接字编程文件上传问题?完整文件未上传

如何解决套接字编程文件上传问题?完整文件未上传

| 嗨,我正在使用以下代码将我的文件从android手机上传到服务器bt,文件未完全上传..e.g例如,我上传一个ѭ0up文件,但在服务器上只有
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,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,i);
                        System.out.println(\"Receiving data...\");
                    }


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

解决方法

看起来您在服务器端的同一基础套接字上同时使用BufferedReader和BufferedInputStream,并且在客户端使用两种输出流/写入器。因此,您的BufferedReader正在缓冲,这是应该做的,因此“窃取”了您希望通过BufferedInputStream读取的某些数据。道德:你不能那样做。仅使用DataInputStream和DataOutputStream,并在文件之前从客户端读取的8行中使用writeUTF()/ readUTF()。     ,您在BufferedReader和bufferedInputStream之间共享了相同的基础InputStream。 发生的事情是,当您通过BufferedReader进行读取时,它会将您从基础InputStream请求的几行内容读入其自己的内部缓冲区中。并且当您创建BufferedInputStream时,该数据已经被BufferedReader读取。因此,除了EJP建议不要使用任何缓冲的类之外,还可以创建BufferedInputStream,然后在其顶部创建Reader。代码是这样的:
BufferedInputStream in = new BufferedInputStream(inStream);
Reader inm = new InputStreamReader(in);
将其添加到服务器代码的开头,并删除以下行:
BufferedInputStream in = new BufferedInputStream(inStream);
    ,看到这个,我从没尝试过
  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     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。