Java发送文件,告诉服务器停止读取

时间:2017-09-24 19:49:40

标签: java tcp

将文件发送到服务器时遇到问题。 主要问题是协议。首先我用PrintWriter发送文件大小,然后使用DataOutputStream将二进制数据写入我的服务器。一切正常,但有一个问题。我使用File.length()方法来获取文件长度。 Docs说,当方法返回时,可以读取更少的字节长度。这就是有时发生的事情。所以在此之后,我的服务器中正在读取数据的while循环将永远不会退出,因为它等待数据的最后一个字节。我尝试了所有的东西,比如客户端的readfully()。没有任何效果。有没有人知道如何以另一种方式循环这个?就像等待特定的字节告诉服务器停止它一样,因为没有更多的数据要读取? 我真的不知道如何实现通信协议。我到处寻找信息,但我没有发现任何帮助。

为什么我不关闭连接以退出while循环? 我需要稍后使用此连接,告诉客户端文件已成功上传。

客户端:发送文件长度= 1000
服务器:读取文件长度
客户端:发送字节数据...
服务器:读取字节数据...
客户端:完成发送字节数据,只写900 服务器:仍在等待数据,因为它没有达到例外的长度。

private boolean uploadPicture(File file) throws Exception
        {
            int maxLength = Integer.parseInt(this.readDataCarefully(10)); //read until \n appears
            int readed = 0;

            if(maxLength >= 500000)
            {
                return false;
            }

            DataInputStream dateiInputStream = null;
            FileOutputStream dateiStream = null;
            dateiInputStream = new DataInputStream(this.socket.getInputStream());
            dateiStream = new FileOutputStream(file);

            int count;
            byte[] buffer = new byte[maxLength];
            while ((count = dateiInputStream.read(buffer)) > 0)
            {
                dateiStream.write(buffer, 0, count);
                readed = readed+count;
                if(maxLength <= readed) //True when file transfere complete.
                {
                    break;
                }
            }   
            System.out.println("Finished");
            dateiStream.close();

            if(this.checkImageFile(file)) //Checks file
            {
                System.out.println("PB WRITTEN.");
                return true;
            }
            return false;
        }

0 个答案:

没有答案