【问题标题】:How to get a server to send a client a message on connection?如何让服务器在连接时向客户端发送消息?
【发布时间】:2011-10-17 14:53:05
【问题描述】:

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

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

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

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

请帮忙?

【问题讨论】:

    标签: java tcp client-server


    【解决方案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();
    }
    

    【讨论】:

    • 我试图让服务器在连接时立即发送它,但它不起作用。我将编辑我的帖子以显示我现在正在尝试的内容。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      在我的基本服务器-客户端 TCP 示例中,我提出了一种方法……当客户端被接受时,它会收到一条欢迎消息。当我从客户端发送角色时,它会给我回名字。这里是源链接>>http://matrixsust.blogspot.com/2011/10/basic-tcp-server-client.html

      希望对你有帮助。

      【讨论】:

        【解决方案4】:

        我不相信让服务器不经提示就向客户端发送消息是可能的。发送消息“dir”并在服务器上监听,然后在客户端监听并回复。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-29
          • 2015-01-05
          • 1970-01-01
          • 2013-08-13
          • 1970-01-01
          • 2015-11-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多