我正在尝试编写一个基本的客户端 - 服务器程序,以允许客户端遍历服务器的文件。我希望服务器在客户端连接时,将当前目录中的所有文件列表发送给客户端。我该怎么做呢?我已经创建了一个包含所有文件名的数组,并且我试图将它们发送到客户端,它只是处于无限循环中(因为它意味着!)并且什么都不做。
尝试让服务器在连接客户端时发送消息:
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 :(得分:1)
首先确保您在客户端和服务器之间进行以下握手:
...正常沟通。
发送0大小的消息有时可能会导致问题
所以使用查询 - 响应方法似乎是准确的。
答案 1 :(得分:1)
您的主要问题是您正在尝试从客户端向服务器发送空字符串。空字符串转换为0长度字节数组。实际上,您不是在客户端和服务器之间发送任何数据。在这种情况下,服务器将继续等待通过套接字的InputStream检索数据。由于服务器仍在等待,因此它不会继续将数据发送回客户端。因此,当您的客户端尝试从服务器侦听数据时,它会无限期地等待,因为服务器永远不会到达代码的那一部分。
如果您的目标是让服务器在连接时简单地发送数据,那么您有几个选择。
示例服务器:
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();
}
答案 2 :(得分:1)
在我的基本服务器 - 客户端TCP示例中,我做了一个方法...当客户端被接受时,它收到了欢迎消息。当我从客户端发送角色时,它给了我回名。这是源&gt;&gt;的链接http://matrixsust.blogspot.com/2011/10/basic-tcp-server-client.html。
希望它有所帮助。
答案 3 :(得分:0)
我不相信服务器可以自动向客户端发送消息。发送消息“dir”并在服务器上收听,然后在客户端收听并回复。