2011-05-26 68 views
0

我使用的代码Java TCP socket: data transfer is slow,工作很好,但我有一个接收部分的问题,它读取的数据,但不退出while循环,不知道为什么,代码是完全一样的。Java文件传输

确定这样的代码是这样的客户端:

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();} 
      } 
+3

显示我们揭掉codez,宝贝。 – 2011-05-26 22:47:09

回答

1

客户端代码不会结束,直到你把它预计的数据(如,你提到的问题的提问者说的很多)。

而且,您链接的问题提问者的代码不完整,请张贴您的完整代码。

+0

我的意思是你的代码,在你的回应 – Victor 2011-05-26 23:33:30

+0

确保你正确地写入数据,并请复制并粘贴代码。而且,我们并不是所有人都能回答你的问题,所以,它不是我的代码。 – 2011-05-26 23:36:29

+0

请勿复制并粘贴到此处,将其置于与其代码标签相关的问题中 – 2011-05-26 23:38:42

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; 
    } 
    

(模的错误,检查尤其是括号)

+0

1.尝试使用while循环,同样的事情2.如果我关闭连接,那么它是一种聊天应用程序么? 3.ty提示 – Victor 2011-05-27 00:59:13

+0

@Victor看修改后的答案。 – EJP 2011-05-27 01:08:38

+0

是啊你的权利,只是感谢我分配所有的帮助 – Victor 2011-05-27 01:10:05