java - 无法摆脱使用套接字java发送文件中的接收文件循环

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

最佳答案

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

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

我还猜测您没有关闭客户端的OutputStream。

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

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

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

关于java - 无法摆脱使用套接字java发送文件中的接收文件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19605842/

相关文章:

java - 将 post 参数映射到请求中的 DTO

java - TCP_NODELAY 如何影响连续的 write() 调用?

检查套接字监听积压队列是否为空

java - 使用 Apache POI 在 java 中读取 excel (xlsx) 文件(得到奇怪的数字)

java - 条件绑定(bind)未按预期工作

java - mvnw 权限在 travis 构建期间被拒绝错误

java - 通过套接字传输 byte[]

Java 服务器和客户端/RMI 或 Socket?

c - write() 和 send() 解决错误 => 区别?

java - 对象不支持该属性或方法--在IE9中调用Applet