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

时间:2013-10-26 10:56:05

标签: java sockets

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

从Socket InputStream读取时,只有当byte[]得到-1时,客户端才会关闭OutputStream。我假设客户端没有这样做,因此你的while循环正在等待InputStream关闭。

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

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

答案 1 :(得分:0)

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

相关问题