Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扩展Java程序以向其他计算机发送警报消息_Java_Sockets_Network Programming_Client Server_Messaging - Fatal编程技术网

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

扩展Java程序以向其他计算机发送警报消息,java,sockets,network-programming,client-server,messaging,Java,Sockets,Network Programming,Client Server,Messaging,我编写了一个java收信程序,它将PDF格式的收信发送到一个共享文件夹,以便网络中的其他人可以阅读。但是,除非有人告诉他们,否则其他人无法知道某个录取通知已发送,因此我希望程序向其他计算机发送一条警告消息,告诉他们录取通知已发送 现在我已经对此做了一些研究,并认为TCP是一种可行的方法,因为它是可靠的。我也知道这是一个一对多的发送过程,所以我假设我的接收程序将充当服务器,而其他计算机将充当客户端,或者应该反过来 现在,我假设我必须创建一个客户端程序来侦听服务器并等待它发送消息 考虑到这一点,我如

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

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

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

考虑到这一点,我如何:

  • 创建一个客户端程序,该程序持续侦听消息,直到程序关闭。我假设我将使用“while(true)”和sleep。如果是这样,我要让程序休眠多久
  • 将其作为Windows服务的一部分,以便在Windows启动时加载
在服务器端,我如何:

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

哦,这是单向交流。客户端不必回复服务器。

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

无论如何,是的,你可以创建一个简单的听力程序。下面是一个Java客户端从服务器读取消息的示例。它重写线程类的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(消息)等功能的地方 考虑这样一种情况,您有一个Cclipse连接类,该类具有RealTeociLand(String S)方法和(Server Server,Socket套接字)和初始化的ARARYLIST CONLIST。 以下是您将遵循的方法: 在服务器中的单独线程中,接受与的连接

    ClientConnection con = new ClientConnection(this, socket.accept());
    conList.add(con);
    
    然后,当您要向客户端写入时:

    for (ClientConnection c : conList) {
        c.writeToClient("I'm sending you a message!");
    }
    
    我希望你对你需要做什么有一个模糊的概念。阅读套接字文档,它非常有用。同样,与线程应用程序一样,确保您没有在遍历列表时修改列表,并避免竞争条件


    祝你好运

    我知道这并不能真正回答这个问题,但你能给那个人发电子邮件吗?在某人的电脑上设置一个持续监听服务通常是不必要的。然后这个人就必须不断地检查他们的电子邮件。酷,这看起来就像我想做的。现在我对线程不是很熟悉,那么什么是竞争条件呢?竞争条件是指结果可能不同的情况,这取决于哪个线程处理相同数据的速度比另一个线程快。假设您有两个线程,一个读取并打印变量的值,另一个将变量递增一。如果变量初始化为0,则根据首先执行的线程,打印的结果将不同。竞争条件使调试变得可怕,并且经常会产生间歇性错误。对于java,查看'synchronized'关键字。你可以在这里看到一个竞赛条件的例子