我正在对等网络上创建一个聊天应用程序。
我正在尝试编写代码,以便我可以检测哪些计算机安装了应用程序以及它是否正在运行(这样我就可以显示谁在线)。
我认为该程序将多播运行该程序的IP地址,其他人将检测该多播IP并将其添加到列表中以显示在线用户..
请告诉我如何为此编写程序。
或告诉我此应用程序的任何其他逻辑,以显示我的应用程序正在运行的PC
答案 0 :(得分:0)
如果要检测安装了应用程序的客户端,则需要设置始终在后台执行的服务或程序。为什么你需要检查谁安装了它?
为了检测它是否正在运行,您只需执行代码,就像我在程序中概述的那样。
对于您的服务器,您需要运行这样的线程;
class MultiCastServerThread extends Thread {
protected DatagramSocket socket = new DatagramSocket();
protected String multicastGroupId = "224.0.0.224";
protected long delay = 1000l;
protected int port = 2244;
public MultiCastServerThread() throws IOException {
super("SpeakServerThread");
}
public void run() {
InetAddress group = InetAddress.getByName(multicastGroupId);
while (true) {
try {
byte[] buf = new byte[256];
buf = "Message".getBytes();
DatagramPacket packet = new DatagramPacket(buf, buf.length, group, port);
socket.send(packet);
sleep(delay);
}catch (InterruptedException e){
}catch (IOException e) {
e.printStackTrace();
socket.close();
break;
}
}
}
}
它每秒向组播组224.0.0.224
多播消息“消息”。
对于您的客户,您需要调用诸如;
之类的方法final String MULTICAST_GROUP = "224.0.0.224";
final int PORT = 2244;
public String getMultiCast() {
MulticastSocket socket = new MulticastSocket(PORT);
InetAddress address = InetAddress.getByName(MULTICAST_GROUP);
socket.joinGroup(address);
DatagramPacket packet;
byte[] buf = new byte[256];
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String rtn = new String(packet.getData());
socket.leaveGroup(address);
socket.close();
return rtn;
}
它侦听多播组224.0.0.224
,一旦收到数据包就关闭套接字并从数据包字节数组中返回字符串。
但是,socket.recieve()
是一个阻塞调用,根据您的要求,您应该从单独的线程或任务调用客户端方法,并具有一些超时机制。如果没有系统的进一步细节,很难说什么是最好的。