我正在开发客户端 - 服务器应用程序。从客户端,我将文件发送到服务器。 这是我在服务器上读取文件的代码:
private void readfile() throws Exception{
String filename="data.xml";
FileOutputStream fos = new FileOutputStream(filename);
BufferedOutputStream out = new BufferedOutputStream(fos);
BufferedReader buff_read = new BufferedReader(new InputStreamReader(input,"UTF-8"));
byte[] buffer=new byte[1024];
String line;
int count;
while((count=input.read(buffer))>0){
fos.write(buffer,0,count);
fos.flush();
}
System.out.println("het");
fos.close();
}
但是我无法摆脱while循环。字符串“het”nerver在控制台屏幕中显示,而我可以通过记事本++读取文件data.xml意味着文件发送成功。 你能帮我解决这个问题吗? 对不起我可怜的英格丽斯。
答案 0 :(得分:0)
我假设代码中的input
是来自套接字的输入流。
你没有告诉我们你如何将文件发送到你的套接字,这很重要,但我猜你在'客户端'有类似的东西,你在那里读取文件,并使用{{1缓冲区通过客户端的OutputStream发送数据。
我也猜测你没有关闭客户端的OutputStream。
从Socket InputStream读取时,只有当byte[]
得到-1时,客户端才会关闭OutputStream。我假设客户端没有这样做,因此你的while循环正在等待InputStream关闭。
所以问题很可能是在进程的客户端,即发送文件的代码。它已成功发送数据,但它没有向服务器表明传输已完成,因此服务器正在等待。
如果您的系统要求在发送文件后继续使用套接字,则客户端无法关闭套接字,您将需要实现协议,以便服务器知道客户端何时完成。例如,客户端可以通过发送4个字节(整数)开始,指示要发送的文件中的字节数,然后服务器可以解释这些字节,然后从流中读取该字节数。
答案 1 :(得分:0)
read()方法在流结束时返回-1,对于套接字意味着对等体已关闭连接。如果你没有得到-1,则对等体没有关闭连接。