2016-09-25 6 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

Чтобы добавить Roberts ответ, ваш код просто выходит из строя. После того, как у вас есть это исправление, вы можете обратиться к тому, почему вы не можете получить пакетную форму на другом ПК, например, ccarton.

Попробуйте это, и обратите внимание на два замечания

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 вы только что создали объект, но не сделали никакого сетевого ввода/вывода с ним.

Затем вы игнорируете исключение и просто пытаетесь работать с дейтаграммой. Если произошла ошибка ввода-вывода, вероятно, дейтаграмма не была инициализирована и, следовательно, все еще имеет IP-адрес null и порт -1.

Если ничего не происходит после socket.receive() Я бы предположил, что вызов заблокирован, ожидая, когда пакет зайдет. Вы фактически запускаете клиент, который подключается к вашему серверному коду?

 Смежные вопросы

  • Нет связанных вопросов^_^