gpt4 book ai didi

java - 如何让服务器在连接时向客户端发送消息?

转载 作者:可可西里 更新时间:2023-11-01 02:47:42 25 4
gpt4 key购买 nike

我正在尝试编写一个基本的客户端-服务器程序,以允许客户端遍历服务器的文件。我希望让服务器在客户端连接时将当前目录中所有文件的列表发送给客户端。我将如何去做这件事?我已经创建了一个包含所有文件名的数组,并且正在尝试将它们发送给客户端,它只是处于无限循环中(因为它本来就是这样!)并且什么都不做。

尝试让服务器在客户端连接时发送消息:

    DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());


boolean found = false;

//Read the data from the input stream
for (int i=0;i < fileList.length;i++) {
outToClient.writeBytes(fileList[i].getName());
}

让服务器接收这个:

//Prepare an object for reading from the input stream
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

//Read the data from the input stream
sentence = inFromServer.readLine();

但这样做只会让客户端陷入无限循环,什么都不做。

请帮忙?

最佳答案

您的主要问题是您试图从客户端向服务器发送一个空字符串。空字符串转换为 0 长度字节数组。实际上,您没有在客户端和服务器之间发送任何数据。在这种情况下,您的服务器将继续等待通过套接字的 InputStream 检索数据。由于服务器仍在等待,它不会继续将数据发送回客户端。结果,当您的客户端尝试从服务器监听数据时,它会无限期地等待,因为服务器永远不会到达该部分代码。

如果您的目标是让服务器在连接时简单地发送数据,您有几个选择。

  1. 连接后让服务器立即将列表发送给客户端。您不必在这里进行双向通信。客户端可以立即开始监听 InputStream。
  2. 让客户端向服务器发送至少 1 个字节,服务器将能够通过其 InputStream 检索该字节,然后继续处理。如果您需要执行多个功能,那么您可能需要考虑发送一个有意义的字符串值,例如 out.write("list".getBytes("UTF-8"));然后服务器可以根据接收到的值执行操作。

示例服务器:

ServerSocket socket = new ServerSocket(8888);
Socket cSocket = socket.accept();

PrintWriter out = null;
try {
out = new PrintWriter(new OutputStreamWriter(cSocket.getOutputStream()));

for (String file : new File(".").list()) {
out.println(file);
}
}
finally {
if (out != null) {
out.close();
}
cSocket.close();
socket.close();
}

示例客户端:

Socket s = new Socket("localhost", 8888);
BufferedReader in = null;

try {
in = new BufferedReader(new InputStreamReader(s.getInputStream()));

String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
}
finally {
if (in != null) {
in.close();
}
s.close();
}

关于java - 如何让服务器在连接时向客户端发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5260624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com