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