-1

我正在对等网络上创建一个聊天应用程序。

我正在尝试编写代码,让我能够检测哪些计算机安装了应用程序以及它是否正在运行(以便我可以显示谁在线)。

我认为该程序将多播该程序正在运行的IP地址,而其他人将检测该多播IP并将它们添加到列表中以显示在线用户..

请告诉我如何为此编写程序。

或告诉我此应用程序的任何其他逻辑以显示我的应用程序在哪台电脑上运行

4

1 回答 1

1

如果要检测安装了应用程序的客户端,则需要设置始终在后台执行的服务或程序。为什么需要检查谁安装了它?

为了检测它是否正在运行,您可以简单地执行我在您的程序中概述的代码。

对于您的服务器,您将需要运行这样的线程;

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;
            }
        }
    }
}

它每秒将消息“Message”多播到多播组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()阻塞调用,根据您的要求,您应该从单独的线程或任务调用客户端方法,并具有一些超时机制。如果没有您系统的更多详细信息,很难说什么是最好的。

于 2013-08-16T10:59:12.180 回答