1

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

    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”神经元显示在控制台屏幕上,而我可以通过记事本++读取文件 data.xml 意味着文件发送成功。你能帮我解决这个问题吗?对不起我可怜的英语。

4

2 回答 2

0

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

于 2013-10-26T23:39:09.443 回答
0

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

您没有告诉我们如何将文件发送到您的套接字,这很重要,但我猜您在“客户端”端有类似的东西,您读取文件并使用byte[]缓冲区发送数据客户端的输出流。

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

从 Socket InputStream 读取时,您唯一会read(...)得到 -1 的时间是客户端关闭 OutputStream 时。我假设客户端不这样做,因此您的 while 循环正在等待 InputStream 关​​闭。

所以问题很可能出在进程的客户端,即发送文件的代码上。它已经成功发送了数据,但是它并没有向服务器表明发送完成,所以服务器正在等待。

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

于 2013-10-26T11:32:40.303 回答