使用socket java无法在send文件中获取接收文件循环

我正在开发客户端 – 服务器应用程序 从客户端,我将文件发送到服务器。 这是我在服务器上读取文件的代码:

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意味着文件发送成功。 你能帮我解决这个问题吗? 对不起我可怜的英格利斯。

我假设您的代码中的输入是来自套接字的输入流。

你没有告诉我们你如何将文件发送到你的套接字,这很重要,但我猜你在’客户端’有类似的东西,你在那里读取文件,并使用byte[]缓冲区发送客户端OutputStream上的数据。

我也猜测你没有在客户端关闭OutputStream。

从Socket InputStream读取时,只有当您read(...)并获得-1时,客户端才会关闭OutputStream。 我假设客户端没有这样做,因此你的while循环正在等待InputStream关闭。

所以问题很可能是在进程的客户端,即发送文件的代码。 它已成功发送数据,但它没有向服务器指示传输已完成,因此服务器正在等待。

如果您的系统要求在发送文件后继续使用套接字,则客户端无法关闭套接字,您将需要实现协议,以便服务器知道客户端何时完成。 例如,客户端可以通过发送4个字节(整数)开始,指示要发送的文件中的字节数,然后服务器可以解释这些字节,然后从流中读取该字节数。

read()方法在流结束时返回-1,对于套接字意味着对等体已关闭连接。 如果您没有获得-1,则对等方不会关闭连接。