我编写了一个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/