Java文件传输

时间:2011-05-26 22:43:01

标签: java

我正在使用Java TCP socket: data transfer is slow中的代码,效果很好,但我在接收部分有一个问题,它读取数据但不退出while循环,不知道为什么,代码正好是相同。

好,所以代码就像这个客户端:

uploadFile.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent ev){
            try{
                JFileChooser chooser = new JFileChooser();
                File file=null;
                int returnVal = chooser.showOpenDialog(UserWindow.this);
                if (returnVal == JFileChooser.APPROVE_OPTION)
                    file = chooser.getSelectedFile();
                FileInputStream fis = new FileInputStream(file);
                OutputStream os= Client.socket.getOutputStream();
                int packetSize=65536;
                byte[] buffer = new byte[packetSize];
                Client.out.writeObject("upload file");
                int read=0;
                do{
                    os.write(buffer, 0, read);
                    System.out.println(read);
                }while((read = fis.read(buffer))!=-1);
                os.flush();
                System.out.println("sent");
                fis.close();
            }
            catch(Exception ex){
                ex.printStackTrace();
                JOptionPane.showMessageDialog(null,"File send error: "+ex.toString(), "Error", JOptionPane.ERROR_MESSAGE);}
        }
    });

服务器端:

else if(message.equals("upload file")){
                try{
                    FileOutputStream fos=new FileOutputStream("doc.pdf");
                    BufferedOutputStream bos = new BufferedOutputStream(fos);
                    int packetsize=65536;
                    byte[] buffer = new byte[packetsize];
                    InputStream is =socket.getInputStream();
                    int read=0;
                    do{
                        bos.write(buffer,0,read);
                        System.out.println(read);
                    }while((read = is.read(buffer))!=-1);
                    System.out.println("received");
                    bos.close();
                    fos.close();


                }catch(Exception ex){ex.printStackTrace();}
            }

2 个答案:

答案 0 :(得分:1)

客户端代码在您向其发送预期数据之前不会结束(因为,您所链接的问题的提问者很多)。

并且,您链接的问题的提问者的代码不完整,请发布您的完整代码。

答案 1 :(得分:0)

  1. 你的'do'循环应该是'while'循环。通过'do'形式完成的所有操作都是浪费的第一个操作,其中长度为零。这没有错,但没有意义。

    while ((count = in.read(buffer)) > 0)
      out.write(buffer, 0, count);
    
  2. 在客户端关闭连接之前,服务器端循环不会终止,而您似乎从未这样做过。这就是导致read()返回-1的原因。

  3. 您正在使用actionPerformed()方法执行所有操作,该方法在AWT线程中执行,因此它将阻止GUI。对于长时间运行的操作,必须使用单独的线程而不是AWT线程。

  4. 如果您需要在发送文件后保持连接打开,则需要在文件之前发送文件的长度,例如通过DataOutputStream.writeLong().然后修改读取循环以准确读取多个字节:

    final long total = dis.readLong();
    long current = 0;
    while (current < total &&
           (count = dis.read(buffer, 0, total-current > buffer.length ? buffer.length : (int)(total-current))) > 0)
    {
      out.write(buffer, 0, count;
      current += count;
    }
    
  5. (模数错误,特别检查括号)