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

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

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

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


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


在服务器端,我如何:


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


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

最佳答案

首先,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()));
}


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


编写程序让客户知道您的地址即可与其联系。
接受连接,然后将套接字存储在列表中。
当您需要发送消息时,遍历列表并将数据发送给其中的每个人。


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

this.socket = new ServerSocket(port);


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

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


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

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


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

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


我希望您对需要做什么有所了解。阅读Socket文档,它非常有用。另外,与线程应用程序一样,请确保您没有在遍历列表时做任何事情,例如修改列表,并避免出现竞争情况。

祝好运!

关于java - 扩展我的Java程序以向其他计算机发送警报消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11128121/

10-10 21:51
查看更多