Соединения Java Socket в очереди - PullRequest
2 голосов
/ 10 ноября 2009

У меня настроен клиент / сервер. Сервер (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)

Оказывается, я не могу назначить дополнительный набор потоков ввода / вывода для соединений сокетов, которым уже был назначен набор потоков.

Спасибо всем за помощь!

Ответы [ 3 ]

4 голосов
/ 10 ноября 2009

Честно говоря, этот вопрос выглядит как решение задачи колледжа.

Подсказка : сначала напишите простого издателя / подписчика. Установите один процесс, который будет записывать hello world в сокет, и второй процесс, который будет читать из этого сокета. Тогда возьми это оттуда. Бьюсь об заклад, вы упускаете что-то очевидное: -)

2 голосов
/ 10 ноября 2009

Вы уверены, что все открывающее рукопожатие было извлечено из сокета перед построением потоков ввода-вывода объекта?

Например, если клиент отправляет TTT\n\n в качестве игрового запроса, а ваш код читает только TTT\n, а другой \n остается в потоке, тогда ObjectInputStream завершится ошибкой.

Вы не показывает часть, где выбор игры пользователя читается из сокета. Итак, это всего лишь предположение.

1 голос
/ 10 ноября 2009

Я предполагаю, что исключение связано с кодом, который вы описали в начале своего поста. Я бы начал с изучения того, что вы делаете с сокетами, прежде чем ваша программа получит фрагмент кода, который вы опубликовали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...