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

时间:2011-03-10 13:59:24

标签: java tcp client-server

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

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

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

但这样做只会使客户端处于无限循环中而无所作为。

请帮忙吗?

4 个答案:

答案 0 :(得分:1)

首先确保您在客户端和服务器之间进行以下握手:

  1. 监听服务器
  2. 客户端连接
  3. 服务器接受
    现在有两条路:
  4. 服务器侦听命令
  5. 客户端发送命令'dir'
  6. 客户开始倾听
  7. 服务器发回您的列表
    备用路径:
  8. 客户端侦听
  9. 服务器发送列表
  10. 服务器开始监听
  11. ...正常沟通。
    发送0大小的消息有时可能会导致问题 所以使用查询 - 响应方法似乎是准确的。

答案 1 :(得分:1)

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

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

  1. 连接后,服务器立即将列表发送给客户端。您不必在这里进行双向沟通。客户端可以立即开始监听InputStream。
  2. 让客户端向服务器发送至少1个字节,服务器将能够通过其InputStream检索,然后继续处理。如果你需要执行多个函数,那么你可能想要查看发送一个字符串值,这意味着什么,例如out.write(“list”.getBytes(“UTF-8”));然后,服务器可以根据接收的值执行操作。
  3. 示例服务器:

    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”并在服务器上收听,然后在客户端收听并回复。