2017-09-15 69 views
1

我在写一个程序,它有一个客户端和服务器,客户端将发送一个img文件到服务器。下面的代码是针对服务器的,它将在obIn.read最后一次运行时阻塞在while循环中,因此它永远不会返回-1并打破循环。它确实打破了我的客户端循环。所以我试图在客户端循环之后刷新它,但它似乎没有任何好处。我不想关闭obOut,因为那样会关闭我想保持打开的套接字。服务器端是它从obIn(输入流是一个实例变量)接收咬入的位置,并将其写入到我创建的文件中。服务器和客户端发送文件Java

    //server receives file 
        File file = new File("image/image.png"); 
        BufferedOutputStream fileOut = new BufferedOutputStream(new FileOutputStream(file)); 
        byte[] bytes = new byte[1000]; 
        int c = 0; 
        while((c = obIn.read(bytes)) != -1) { 
         fileOut.write(bytes, 0, c); 
         fileOut.flush(); 
         System.out.println(c); 
        } 
        System.out.println(c); 
        fileOut.close(); 
        System.out.println("File Created"); 

   //Client 
       String imgPath = in.nextLine(); 
       File file = new File(imgPath); 

       BufferedInputStream fileIn = new BufferedInputStream(new FileInputStream(file)); 
       byte[] bytes = new byte[1000]; 
       int c = 0; 
       while((c = fileIn.read(bytes)) != -1) { 
        obOut.write(bytes, 0, c); 
        obOut.flush(); 
        System.out.println(c); 
       } 
       obOut.write(bytes, 0, 1000); 
       obOut.flush(); 
       System.out.println(c); 
       fileIn.close(); 
       System.out.println("File Sent"); 

此图片的输出,其中所述服务器是在顶部和客户端是上底部。那是我发现服务器卡住阻塞的地方。

enter image description here

Here是我发现这个方法,并试图使其成为我的设置工作。这是我第一次使用流。

+1

更换writeflush功能的同时循环的一面派'-1'您需要关闭()作家(这里'obOut')。如果你不想这么做,可以说你想发送很多文件,那么你需要创建自己的*协议*(客户端和服务器之间的通话规则)。这样的协议应该说明,首先你要通知服务器它应该有多少字节(文件的长度),然后而不是等待-1,你只需要计算到达多少字节,并在收到所有字节后服务器可以做其他事情,或者等待它应该处理的其他任务的信息(如接收另一个文件)。 – Pshemo

回答

0

在您的客户端类的尝试obOut.close();

相关问题