我正在开发客户端-服务器应用程序。从客户端,我将文件发送到服务器。 这是我关于在服务器上读取文件的代码:
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”神经显示在控制台屏幕上,而我可以通过 Notepad++ 读取文件data.xml,这意味着文件发送成功。 你能帮我解决这个问题吗? 抱歉我的英语不好。
最佳答案
我假设代码中的输入
是来自套接字的输入流。
您没有告诉我们如何将文件发送到套接字,这很重要,但我猜测您在“客户端”端有类似的东西,您在其中读取文件并使用 byte[]
缓冲区通过客户端的 OutputStream 发送数据。
我还猜测您没有关闭客户端的OutputStream。
当从 Socket InputStream 读取数据时,唯一一次 read(...)
并得到 -1 是在客户端关闭 OutputStream 时。我假设客户端不这样做,因此您的 while 循环正在等待 InputStream 关闭。
因此问题可能出在进程的客户端,即发送文件的代码。已经成功发送数据,但是还没有向服务器表明发送完成,所以服务器正在等待。
如果您的系统要求您在发送文件后继续使用套接字,则客户端无法关闭套接字,您将需要实现一个协议(protocol),以便服务器知道客户端何时完成。例如,客户端可以首先发送 4 个字节(整数),指示要发送的文件中的字节数,然后服务器可以解释这些字节,然后从流中读取该字节数。
关于java - 无法摆脱使用套接字java发送文件中的接收文件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19605842/