У меня установлен клиент/сервер. Сервер (Provider.java
) примет 2 соединения разъема. Каждому клиенту, после подключения, задают вопрос, какой тип игры они хотели бы сыграть - Tic Tac Toe, Chess или Connect 5. В зависимости от их ответа соединения Socket затем сохраняются в конкретной очереди игры. Так, Tic Tac Toe имеет очереди, и соединение 5 имеет очереди и т.д.Соединения сокетов Java в очереди
Очереди реализованы следующим образом:
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
. Эти потоки не передаются в очередь с подключениями, поэтому в приведенном выше коде новые потоки назначаются соединениям. Затем эти потоки передаются в игру с резьбой, чтобы начать игру. Могу ли я сделать это (назначить новые потоки для соединений)? После того, как потоки уже были назначены им?
Во-вторых, я правильно хранил/удалял соединения сокетов в очереди?
Благодарим за помощь!
ОБНОВЛЕНИЕ:
Здесь ошибка я получаю:
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)
Оказывается, что не может назначить дополнительный набор входных/выходных потоков к гнезду соединения, которые уже назначен набор потоков.
Спасибо всем за вашу помощь!
Можем ли мы увидеть трассировку стека ошибок коррупции в потоке, или это коммерческий секрет? –
обновите мое сообщение, спасибо! – littleK