【发布时间】:2021-07-20 08:53:12
【问题描述】:
我正在尝试制作一个简单的服务器/客户端应用程序来发送消息和文件。
我的客户端首先发送文件名,然后是文件本身,最后等待服务器的响应。
我的服务器做相反的事情,读取文件名,读取文件,发送响应。
问题是客户端卡在String response = dataInputStream.readUTF();
而服务器卡在Files.copy(Paths.get(fileName), dataOutputStream);
我试图从客户端删除String response = dataInputStream.readUTF();,没有它它工作正常。有人可以帮我理解为什么我在发送文件后执行readUtf() 时卡住了吗?
谢谢
这是我的客户
public static void main(String[] args) throws IOException {
String fileName = "hello.txt";
try (Socket clientSocket = new Socket(HOST, PORT)) {
DataInputStream dataInputStream = new DataInputStream(clientSocket.getInputStream());
DataOutputStream dataOutputStream = new DataOutputStream(clientSocket.getOutputStream());
dataOutputStream.writeUTF(fileName);
Files.copy(Paths.get(fileName), dataOutputStream);
String response = dataInputStream.readUTF();
LOGGER.info(response);
}
}
这是我的服务器
public static void main(String args[]) throws IOException {
try (ServerSocket ss = new ServerSocket(PORT)) {
Socket clientSocket = ss.accept();
DataOutputStream dataOutputStream = new DataOutputStream(clientSocket.getOutputStream());
DataInputStream dataInputStream = new DataInputStream(clientSocket.getInputStream());
String fileName = dataInputStream.readUTF();
Files.copy(dataInputStream, Paths.get(fileName));
dataOutputStream.writeUTF("New file saved");
}
}
【问题讨论】:
-
你试过
flush输出流吗? -
@QBrute 我尝试在客户端内部的
Files.copy之后添加dataOutputStream.flush();,但结果相同,卡住了 -
@user16320675 谢谢,我尝试刷新流,但不能解决问题,您知道我该怎么做吗?
-
@user16320675 顺便说一句,当我因为卡住而终止进程时,文件是用正确的内容创建的,响应不在文件内。
-
这里的问题是
Files.copy(dataInputStream, Paths.get(fileName))不会退出,除非到达流的末尾,但是只有在到达Client中的try 块的末尾时才会自动关闭该流。因此,当客户端在尝试结束之前运行String response = dataInputStream.readUTF()时,它实际上永远不会关闭服务器中Files.copy正在读取的流。因此它们都被卡住了——因为客户端无法读取response,因为服务器永远不会到达“保存的新文件”行。
标签: java nio serversocket java-io