将文件发送到服务器时遇到问题。 主要问题是协议。首先我用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;
}