2014-02-15 8 views
-1

У меня возникла проблема, когда я могу подключиться к серверу ServerSocket и отправлять объекты (точнее, пользовательский класс пакета), но когда я использую метод readObject(), мой код зависает и не читает никаких пакетов ,Java ObjectInputStream не будет читать объект?

Вот код клиента:

public class ObjectReaderThread extends Thread { 

public void run() { 

    Object obj = null; 

    while(!ClientTest.clientTest.socket.isClosed()) { 

     try { 

      obj = ClientTest.serverReader.reader.readObject(); 

      System.out.println("Packet recieved."); 

     } catch(Exception ex) { ex.printStackTrace(); System.exit(-1); } 

    } 

} 

Как вы можете видеть, я использую отдельный поток для моего цикла readObject. Может ли кто-нибудь помочь мне определить, что является неправильным? Если вам нужен еще один код, скажите мне, и я могу его опубликовать. Также обратите внимание, что исключение/ошибка не предоставляется. Благодаря!

EDIT: Вот код отправки пакета:

public void sendNextPacketInQueue() { 
    Iterator<Integer> queue = packetQueue.keySet().iterator(); 
    try { 

     if(outputStreamInitialized) ; 

     if(queue.hasNext()) { 

      int key = queue.next(); 
      Packet packet = packetQueue.get(key); 

      if(packet.getLocation().equals(PacketLocation.ALL) && GlobalVars.onlinePlayers.size() > 0) { 

       for(int i = 1; i <= GlobalVars.onlinePlayers.size(); i++) { 
        Player player = GlobalVars.onlinePlayers.get(i); 
        ObjectOutputStream out = new ObjectOutputStream(player.getOutputStream()); 
         out.writeObject(packet); 

        if(GlobalVars.debugOutput) GlobalClassVars.window.printToLog("Packet sent to " + player.getUsername()); 
       } 
      } 
      else { 
       if(GlobalVars.debugOutput) GlobalClassVars.window.printToLog("Not enough players online to send packet to."); 
      } 

      packetQueue.remove(key); 
      if(GlobalVars.debugOutput) GlobalClassVars.window.printToLog("Packet removed."); 

     } 

    } catch(Exception ex) { ex.printStackTrace(); } 
} 

Это постоянно работает в цикле сервера:

while(!serverSocket.isClosed()) { 

     ... 

     this.sendNextPacketInQueue(); 

} 
+4

показать нам код отправки объекта. –

+0

Добавил код. – MrLolEthan

+1

Возможно, outputStreamInitialized является ложным. Возможно, в итераторе очереди ничего нет. Возможно, это не ВСЕ. возможно, размер онлайн-игроков равен 0 (ваша петля ошибочна, так как она начинается с 1 и заканчивается размером, а не начинается с 0 и заканчивается на размер - 1. Это говорит о том, что этот код никогда не выполняется, иначе вы получите исключение). Добавьте следы в свой код или используйте ваш отладчик. Кроме того, вы должны создать новый ObjectOutputStream для каждого отправленного объекта. Создайте его один раз и отправьте все объекты. –

ответ

0

Я много сделал с этим неправильно. Во-первых, я каждый раз создавал новый ObjectOutputStream. Во-вторых, я получал игрока из списка, используя int вместо имени пользователя.

Даже не спрашивайте, как я сделал эти глупые ошибки ...

0

Ваш клиентский код блокировки на readObject вызова. Он ждет, пока следующий объект не станет доступен в сокете. Хотя вы пишете объект на сокете сервера, ваш клиент не получит его сразу из-за буфера сокета. Чтобы клиент мог немедленно получить объект, вам необходимо очистить поток на стороне сервера после записи каждого объекта. В sendNextPacketInQueue метод добавить out.flush() звонок после out.writeObject звонок.

out.writeObject(packet); 
out.flush(); 
+0

Спасибо за ответ, но я уже пробовал это. Это ничего не меняет. – MrLolEthan

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