2016-09-25 8 views
-1

私は単純なポンゲームにマルチプレイヤーフォームを追加しようとしていますが、DatagramPacketを起動してIPとポートを読み取ろうとすると、ipはnullで、ポートは-1です。誰がなぜこれを行うのか知っていますか?ソケットがまだパケットを受信して​​いなかったのかもしれないと思ったかもしれませんが、私が見ると、socket.recieve(packet)の後のすべてのコードが実行されていないことがわかりました。私は、サーバーを起動DatagramPacketにアドレスがありません

コード:

public GameServer(PongEngine engine) { 
    this.engine = engine; 
    try { 
     this.socket = new DatagramSocket(4269); 
    } catch (SocketException e) { 
     e.printStackTrace(); 
    } 
} 

public void run() { 
    while(true) { 
     byte[] data = new byte[1024]; 
     DatagramPacket packet = new DatagramPacket(data, data.length); 
     System.out.println(packet.getAddress() + ":" + packet.getPort()); 
     try { 
      socket.receive(packet); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     String message = new String(packet.getData()); 
     if(message.trim().equalsIgnoreCase("ping")) { 
      System.out.println("CLIENT[" + packet.getAddress() + ":" + packet.getPort() + "] > " + message); 
      sendData("pong".getBytes(), packet.getAddress(), packet.getPort()); 
     } 
    } 
} 
+1

あなたの最初の考えは正しいです。受信ファンクションが呼び出されるまで、IPおよびポートの値は移入されません。そのポイントの後のコードが実行されていない場合、例外がスローされるか、単にクライアントが接続していないかのいずれかです。受信はパケットを受信するまでブロックします。 – ccarton

+0

私は知っている限りクライアントとサーバーを正しく実行しています。クライアントはhttp://pastebin.com/2zMdgNVPです。何か問題は見えますか? – TheGamerPlayz

答えて

1

はロバーツの答えに追加するには、あなたのコードは、単に故障しています。一度それを固定したら、ccartonのように他のPCのパケットフォームを受け取っていないかもしれない理由を説明することができます。

はこれを試してみてください、そして2件のコメント

public void run() { 
    while(true) { 
     byte[] data = new byte[1024]; 
     DatagramPacket packet = new DatagramPacket(data, data.length); 

     try { 
      //Wait for packet (The code will not move on until a packet is received or there is an error) 
      System.out.println("Waiting for packet"); 
      socket.receive(packet); 

      //Move your socket/port info after receiving a packet so you don't get null or -1 
      System.out.println("Packet received: "+ packet.getAddress() + ":" + packet.getPort()); 

      //Move your code inside try, rather than after 
      String message = new String(packet.getData()); 
      if(message.trim().equalsIgnoreCase("ping")) { 
       System.out.println("CLIENT[" + packet.getAddress() + ":" + packet.getPort() + "] > " + message); 
       sendData("pong".getBytes(), packet.getAddress(), packet.getPort()); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

は今、あなたはまだ同じ問題を得るのですか注意してください?

2

DatagramPacketgetAddressは、このデータグラムが送信されているマシンまたはデータグラムが受信されたマシンのIPアドレスを返します。

最初のSystem.out.printlnでは、オブジェクトを作成したばかりですが、ネットワークI/Oを実行していません。

例外を無視して、データグラムを操作してみます。 I/Oエラーが発生した場合は、データグラムが初期化されていない可能性が高いため、IPアドレスはnull、ポートは-1です。

socket.receive()の後に何も起こらない場合は、パケットが入るのを待って、呼び出しがブロックされていると思います。サーバーコードに接続するクライアントを実際に実行しますか?

関連する問題