簡體   English   中英

LAN上的Peer to Peer發現

[英]Peer to Peer discovery on LAN

所以,正如標題可能表明我在Java項目中遇到了一些麻煩。 我想要做的是:

  • 我有兩台運行應用程序X的計算機
  • 還有另外三台運行應用程序Y的計算機

我需要做的是在X和Y之間建立連接。例如,有人使用運行X的計算機,在discovrey進程之后,他們將返回運行Y app的計算機列表及其IP,而另一種方式。

我使用UDP廣播完成了這項工作,但有時會失敗。 計算機通過WiFi連接,所以基本上通過路由器。 在許多情況下,任何X計算機都可以通過我的UDP發現方法看到Y計算機,但有時不會,除非我手動指向IP,有時甚至不會。

以下是用於發現偵聽特定端口的服務器的代碼:

public static ArrayList<InetAddress> searchComputer() {
    ArrayList<InetAddress> targets = new ArrayList<InetAddress>();
    try {
        c = new DatagramSocket();
        c.setBroadcast(true);

        byte[] sendData = "DISCOVER_PC_SERVER_REQUEST".getBytes();
        try {
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("255.255.255.255"), 2005);
            c.send(sendPacket);
        } catch (Exception e) {}
        Enumeration interfaces = NetworkInterface.getNetworkInterfaces();

        while (interfaces.hasMoreElements()) {
            NetworkInterface networkInterface = (NetworkInterface) interfaces.nextElement();

            if (networkInterface.isLoopback() || !networkInterface.isUp()) {
                continue; 
            }

            for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {
                InetAddress broadcast = interfaceAddress.getBroadcast();
                if (broadcast == null) {
                    continue;
                }

                try {
                    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, broadcast, 8888);
                    c.send(sendPacket);
                } catch (Exception e) { }
            }
        }
        byte[] recvBuf = new byte[15000];
        DatagramPacket receivePacket = new DatagramPacket(recvBuf, recvBuf.length);
        if (useInstant) {
            c.setSoTimeout(500);
        }
        else {
            c.setSoTimeout(4000); //EXECUTE THE WHILE FOR 4 SECONDS, THEN RETURN WHATEVER THE RESULTS ARE.
        }
        while (true) {
            c.receive(receivePacket);
            String message = new String(receivePacket.getData()).trim();
            if (message.equals("DISCOVER_PC_SERVER_RESPONSE")) {
//              return receivePacket.getAddress();
                targets.add(receivePacket.getAddress());
            }
        }
//      c.close();
    } catch (IOException ex){}
    return targets;
}

這是我的“服務器”:

private void start_Discovery() throws Exception {
    //Keep a socket open to listen to all the UDP trafic that is destined for this port
    socket = new DatagramSocket(2005, InetAddress.getByName("0.0.0.0"));
    socket.setBroadcast(true);

    while (true) {
//      System.out.println(getClass().getName() + ">>>Ready to receive broadcast packets!");

        //Receive a packet
        byte[] recvBuf = new byte[15000];
        DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
        socket.receive(packet);

        //Packet received
//      System.out.println(getClass().getName() + ">>>Discovery packet received from: " + packet.getAddress().getHostAddress());
//      System.out.println(getClass().getName() + ">>>Packet received; data: " + new String(packet.getData()));

        //See if the packet holds the right command (message)
        String message = new String(packet.getData()).trim();
        if (message.equals("DISCOVER_ANDROID_SERVER_REQUEST")) {
            byte[] sendData = "DISCOVER_ANDROID_SERVER_RESPONSE".getBytes();

            //Send a response
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, packet.getAddress(), packet.getPort());
            socket.send(sendPacket);

//          System.out.println(getClass().getName() + ">>>Sent packet to: " + sendPacket.getAddress().getHostAddress());
        }
    }
}

為什么有時他們無法看到對方,即使他們連接到同一個路由器? 額外:是否有特殊情況,X計算機通過LAN連接,Y計算機通過WiFi連接?

為什么有時他們無法看到對方,即使他們連接到同一個路由器?

因為廣播是使用無連接協議的UDP服務完成的。 使用UDP,您只需將數據包(數據報)發送到網絡上的某個IP地址。 您無法保證數據會到達。

是否有特殊情況,X計算機通過LAN連接,Y計算機通過WiFi連接?

甚至,X cmputers通過LAN連接,而Y通過WiFi連接,它們都屬於同一個路由器網絡。 因此,網絡發現和網絡服務將可用。 這沒有任何問題。 這一切都是公平的,與你所擁有的情況沒有什么不同!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM