0

我编写了一个 java 摄入程序,它将 PDF 格式的摄入量发送到共享文件夹,以便网络中的其他人可以阅读它。但是,除非有人告诉他们,否则其他人无法知道已发送摄入量,因此我希望程序向其他计算机发送警报消息,告诉他们已发送摄入量。

现在我已经对此进行了一些研究,并认为 TCP 是可靠的方法,因为它是可靠的。我也知道这是一个一对多的发送,所以我假设我的 Intake 程序将充当服务器,而其他计算机将是客户端,还是应该反过来?

现在我假设我必须创建一个客户端程序来监听服务器并等待它发送消息。

考虑到这一点,我该如何:

  • 创建一个持续监听消息的客户端程序,直到程序关闭。我假设我将使用“while (true)”并睡觉。如果是这样,我让程序休眠多长时间?
  • 将其作为 Windows 服务的一部分,以便在 Windows 启动时加载。

在服务器端,我该如何:

  • 向多台计算机发送消息,因为 TCP 无法进行多播或广播。我假设数组/向量将在这里发挥作用。

哦,这是一种单向通信。客户端不必响应服务器。

4

1 回答 1

1

首先,UDP是相当可靠的(其实和IP协议本身一样可靠)。TCP 只是确保接收到数据,这在后端涉及很多魔法。除非您绝对需要确保其他机器收到消息,否则您可以使用 UDP 来完成。请注意,我并不是说“不要使用 TCP”,我只是想直截了当地说您也应该考虑 UDP。

无论如何,是的,您可以创建一个简单的听力程序。这是从服务器读取消息的 Java 客户端示例。它覆盖了 Thread 类的 run 方法:

public void run() {
    try {
        String messageFromServer = reader.readLine();
        while (messageFromServer != null) {
            // Do things with messageFromServer here                               
            // processor.processFromServer(messageFromServer);
        messageFromServer = reader.readLine(); // Blocks the loop, waits for message
        }
    }
    catch (IOException e) {
            // Handle your exception
    }
}

除其他外,我的线程是这样设置的:

public CommunicationThread(String hostname, int port, int timeout) throws IOException, SocketTimeoutException {
    InetSocketAddress address = new InetSocketAddress(hostname, port);   
    socket = new Socket();
    socket.connect(address, 2000); // 2000ms time out
    // You can use the writer to write messages back out to the server
    writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));         
    reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}

现在,关于服务器端,您可以执行以下操作:

  1. 编写一个程序以允许客户联系,前提是他们知道您的地址。
  2. 接受连接,并将套接字存储在列表中。
  3. 当您需要发送消息时,遍历列表并将数据发送给列表上的每个人。

您可以使用以下命令开始在您的服务器上收听

this.socket = new ServerSocket(port);

您可以(甚至应该(?))使其线程化,以便您可以在为他人服务的同时接受客户。您可以通过以下方式接受新客户:

socket.accept(); // Blocks, waiting for someone to connect, returns open socket

随意将它传递给一个可以处理 BufferedWriter 的全新类(如果你也想从客户端读取,甚至可能是 BufferedReader )。该类是您将实现诸如 writeToClient(message) 之类的东西的地方 考虑您有一个 ClientConnection 类的情况,该类具有 writeToClient(String s) 方法和(服务器服务器,Socket 套接字)和初始化的 ArrayList conList。以下是您应该遵循的方法:在服务器中的一个单独线程中,接受与

ClientConnection con = new ClientConnection(this, socket.accept());
conList.add(con);

然后,当您想写信给客户时:

for (ClientConnection c : conList) {
    c.writeToClient("I'm sending you a message!");
}

我希望你对你需要做什么有一个模糊的概念。阅读 Socket 文档,它非常有用。此外,与线程应用程序一样,请确保您在遍历列表时不做诸如修改列表之类的事情,并避免竞争条件。

祝你好运!

于 2012-06-20T21:34:20.877 回答