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