扩展我的Java程序以向其他计算机发送警报消息

时间:2012-06-20 21:01:41

标签: java sockets network-programming client-server messaging

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

现在我已经对此做了一些研究,并认为TCP是可行的方法,因为它是可靠的。我也知道这是一对多的发送,所以我假设我的Intake程序将作为服务器,其他计算机将作为客户端,或者它应该是相反的方式吗?

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

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

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

在服务器端,我该如何:

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

哦,这是一种单向沟通。客户端不必回复服务器。

1 个答案:

答案 0 :(得分: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. 当您需要发送消息时,遍历列表并将数据发送给其中的所有人。
  4. 您可以使用

    开始在服务器上收听
    this.socket = new ServerSocket(port);
    

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

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

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

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

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

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

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

    祝你好运!