作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试编写一个基本的客户端-服务器程序,以允许客户端遍历服务器的文件。我希望让服务器在客户端连接时将当前目录中所有文件的列表发送给客户端。我将如何去做这件事?我已经创建了一个包含所有文件名的数组,并且正在尝试将它们发送给客户端,它只是处于无限循环中(因为它本来就是这样!)并且什么都不做。
尝试让服务器在客户端连接时发送消息:
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 检索数据。由于服务器仍在等待,它不会继续将数据发送回客户端。结果,当您的客户端尝试从服务器监听数据时,它会无限期地等待,因为服务器永远不会到达该部分代码。
如果您的目标是让服务器在连接时简单地发送数据,您有几个选择。
示例服务器:
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/
我是一名优秀的程序员,十分优秀!