2009-11-10 2 views
2

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

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

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

+0

Можем ли мы увидеть трассировку стека ошибок коррупции в потоке, или это коммерческий секрет? –

+0

обновите мое сообщение, спасибо! – littleK

ответ

4

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

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

1

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

2

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

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

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