web-dev-qa-db-ja.com

異なるマシン上の単純なUDPブロードキャストクライアントとサーバー

次のクライアントとサーバーのUDPブロードキャストコードは、両方が同じPC上にある場合は正常に機能します。ただし、同じWIFI LAN内の別々のPCにそれらを配置すると、何も起こりません。 2台の別々のPCでマルチキャストバージョンを正常に動作させることができましたが、これはできません:(。両方のファイアウォールをシャットダウンし、両方のPCからそれぞれに正常にpingを実行しました。

このテストの背後にある考え方は、この方法を使用して、クライアントがデータグラムパケットを送信することでLAN上のサーバーを見つけることができるようにすることです(ピア検出)。私はホスト名か何かで何か間違ったことをしていると思いますが、1週間グーグルして新しいアイデアをテストした後、私は公式にそれらからすべてです:(。

public class Client
{
    private String hostname= "localhost";
    private int port=1234;
    private InetAddress Host;
    private DatagramSocket socket;
    DatagramPacket packet;

    public void run()
    {
        try
        {
            Host = InetAddress.getByName(hostname);
            socket = new DatagramSocket (null);
            packet=new DatagramPacket (new byte[100], 0,Host, port);
            socket.send (packet);
            packet.setLength(100);
            socket.receive (packet);
            socket.close ();
            byte[] data = packet.getData ();
            String time=new String(data);  // convert byte array data into string
            System.out.println(time);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}



public class Server
{
    public static final int DEFAULT_PORT = 1234;
    private DatagramSocket socket;
    private DatagramPacket packet;

    public void run()
    {
        try
        {
            socket = new DatagramSocket(DEFAULT_PORT);
        }
        catch( Exception ex )
        {
            System.out.println("Problem creating socket on port: " + DEFAULT_PORT );
        }

        packet = new DatagramPacket (new byte[1], 1);

        while (true)
        {
            try
            {
                socket.receive (packet);
                System.out.println("Received from: " + packet.getAddress () + ":" +
                                   packet.getPort ());
                byte[] outBuffer = new Java.util.Date ().toString ().getBytes ();
                packet.setData (outBuffer);
                packet.setLength (outBuffer.length);
                socket.send (packet);
            }
            catch (IOException ie)
            {
                ie.printStackTrace();
            }
        }
    }
}

誰かが助けることができるかどうか疑問に思っていますか?

10
Paul

実際にブロードキャストするには、LAN上のすべてのIPにパケットを送信する必要があります。可能なIPの範囲は0.0.0.0から254.254.254.254ですが、それらすべてを選択するには、255.255.255.255と記述できます。しかし、ほとんどのルーターはこれをブロックします。 192.168.1.255のようなものが192.168.1.0から192.168.1.254までのすべての255IPにブロードキャストできるようになります。これは、必要なものだと思います。

10
bodyady

ホスト名はローカルホストですか?もしそうなら、あなたは他のPCに到達することはできません。ターゲットIPアドレスで変更する必要があります。

3
chrome