2011-03-10 200 views
1

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

试图在服务器上的客户端的连接发送的消息:

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(); 

,但这样做只是让客户静坐在无限循环,什么都不做。

请帮忙吗?

回答

1

你的主要问题是你正试图从客户端发送一个空字符串到服务器。一个空字符串转换为长度为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(); 
} 
+0

我试图让服务器立即发送连接,但它不会工作。我将编辑我的帖子以显示我现在正在尝试的内容。 – 2011-03-10 15:52:36

+0

@John McCarthy - 新增示例代码来回答。 – 2011-03-10 16:48:19

1

首先请确保您有以下客户端和服务器之间的握手:

  1. 监听服务器
  2. 客户端连接
  3. 服务器接受
    现在有两条路:
  4. 服务器监听命令
  5. 客户端发送命令'dir'
  6. 客户端s挞听
  7. 服务器发回你的清单
    备用路径:
  8. 客户端侦听
  9. 服务器发送列表
  10. 服务器开始听

...正常通信。
发送大小为0的消息有时可能会导致问题。
所以使用查询 - 响应方法似乎是准确的。

0

我不相信有可能有服务器发送消息给客户端自发。发送消息“dir”并在服务器上侦听,然后听取客户端并回复。

相关问题