java - 使用 IOUtils.copy() 时套接字流挂起

标签 java sockets apache-commons-io

我想将包含 XML 的 InputStream 从客户端发送到服务器。所述服务器使用 Streaming API for XML (StAX) 操作 XML 流并将其发送回客户端。

我设法将 XML 发送到服务器,客户端收到答案,但没有退出,因为服务器从未完成从客户端读取 InputStream。 但是当服务器只是将输入转储到 System.out 而不是发送某些内容时,读取完成...

edit我忘了说 IOUtils.copy() 在客户端的两个单独线程中运行。

这里有一些代码可以重现这一点,我在服务器上用 IOUtils.copy() 替换了 StAX 部分。

服务器

ServerSocket serverSocket = new ServerSocket(port);
Socket clientSocket = serverSocket.accept();

InputStream in = clientSocket.getInputStream();
OutputStream out = clientSocket.getOutputStream();
IOUtils.copy(in, out);

客户

Socket socket = new Socket(host, port);
FileInputStream fin = new FileInputStream(file);
OutputStream out = socket.getOutputStream();
IOUtils.copy(fin, out)

InputStream in = socket.getInputStream();
IOUtils.copy(in, System.out)

最佳答案

您必须刷新并关闭 InputStream 和 OutputStream。 像这样:

ServerSocket serverSocket = new ServerSocket(port);
Socket clientSocket = serverSocket.accept();

InputStream in = clientSocket.getInputStream();
OutputStream out = clientSocket.getOutputStream();
IOUtils.copy(in, out);

//add 
out.flush();
in.close();
out.close;

关于java - 使用 IOUtils.copy() 时套接字流挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4325576/

相关文章:

java - OpenJDK 8 (1.8.0_232) 和某些 HTTPS 连接是否存在导致 HTTP 错误 403 的已知问题?

linux - libpcap 是通过 socket API 实现的吗?

java - 重新解析 Map 的干净方法

java - 在 java TailListener 中,如何避免重复的日志消息

java - 使用 apache commons io 更改文件的编码不起作用?

java - 如果选择了某个 JCheckBox,如何删除它?

java - 尝试返回一个字符串数组

java - Ant 不识别类路径

c++ - Boost.Asio 套接字析构函数关闭连接?

java - 排除文件过滤器