У меня настроен клиент / сервер. Сервер (Provider.java
) будет принимать 2 сокета-соединения. После подключения каждого клиента спрашивают, в какую игру он хотел бы играть - Tic Tac Toe, Chess или Connect 5. В зависимости от ответа соединения Socket сохраняются в определенной очереди игры. Итак, Tic Tac Toe имеет очередь, а Connect 5 - очередь и т. Д.
Очереди реализованы следующим образом:
Queue<Socket> qTTT = new LinkedList<Socket>();
Queue<Socket> qC5 = new LinkedList<Socket>();
Queue<Socket> qChess = new LinkedList<Socket>();
Каждый раз, когда добавляется соединение, очереди проверяются на наличие двух соединений. Если в конкретной очереди два соединения, то будет запущена игра такого типа с двумя соединениями. (разработан с использованием шаблона фабричного дизайна).
if (qTTT.size() == 2) {
ObjectOutputStream out = null, out2 = null; // Client 1, Client 2
ObjectInputStream in = null, in2 = null; // Client 1, Client 2
Socket connection1 = null, connection2 = null;
connection1 = qTTT.remove();
connection2 = qTTT.remove();
try {
out = new ObjectOutputStream(connection1.getOutputStream());
out2 = new ObjectOutputStream(connection2.getOutputStream());
in = new ObjectInputStream(connection1.getInputStream());
in2 = new ObjectInputStream(connection2.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
SimpleGameFactory factory = new SimpleGameFactory();
GameStore store = new GameStore(factory);
Game game = store.orderGame("TTT");
System.out.println("We ordered a " + game.getName() + "\n");
tgame.setObject(game);
tgame.setSockets(connection1, connection2);
tgame.setStreams(in, out, in2, out2);
// Start the threaded game
tgame.start();
}
Выше выдается какая-то ошибка повреждения потока. Вот мои вопросы:
Во-первых, когда клиенты впервые подключаются, соединения сокетов связаны с ObjectInputStream
и ObjectOutputStream
. Эти потоки не передаются в очередь с соединениями, поэтому в приведенном выше коде новые потоки назначаются соединениям. Затем эти потоки передаются в многопоточную игру для запуска игры. Могу ли я сделать это (назначить новые потоки для соединений)? После того, как им уже назначены потоки?
Во-вторых, правильно ли я храню / удаляю соединения сокетов в очереди?
Спасибо за вашу помощь!
UPDATE:
Вот ошибка, которую я получаю:
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2232)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2698)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:750)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:268)
at Pools.check_pools(Pools.java:34)
at Provider.start(Provider.java:85)
at StartServer.main(StartServer.java:16)
Оказывается, я не могу назначить дополнительный набор потоков ввода / вывода для соединений сокетов, которым уже был назначен набор потоков.
Спасибо всем за помощь!