Как я могу узнать, когда сокет простаивает?

Я пытаюсь написать клиент-серверное приложение. клиенты публикуют запросы на обслуживание, а сервер получает их и отображает в технической комнате.

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

Мой основной поток прослушивания сервера выглядит так:

while (true) {

         clientSocket = echoServer.accept();
         log.debug("Server Started Listening");
         is = new DataInputStream(clientSocket.getInputStream());
         os = new PrintStream(clientSocket.getOutputStream());

 // An option for a stop listening button. currently not available !
         if( listening==true )  {
         line = is.readUTF();
         os.println(line); 
         System.out.println(line);
         RequestReciever.pharseToRequest(line);
}

Метод pharseToRequest выглядит следующим образом:

public static void pharseToRequest(String input) {

    List<String> list = new ArrayList<String>(Arrays.asList(input.split(";;;")));
    if (list.get(0).equalsIgnoreCase("Login") && list.get(1).equalsIgnoreCase("Login") && list.get(2).equalsIgnoreCase("5"))
    {
        _adminClients.add(list.get(4));
        updateScreenCapture();
        AdminClientUpdate tmp = new AdminClientUpdate(list.get(4));
        Thread aCU = new Thread (tmp);
        aCU.start();
    }
    else
    {
    ServerRequest newReq = new ServerRequest(list.get(0), list.get(1), Integer.parseInt(list.get(2)),list.get(3),list.get(4));
    addRequest(newReq);
    }
}

когда клиент отправляет "Login" в качестве данных, я рассматриваю его как КЛИЕНТА ADMIN и пытаюсь отправить ему снимок экрана через поток AdminclientUpdate.

и когда клиент отправляет обычные данные, я просто обновляю их на экране сервера методом "addRequest".

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

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

Это ошибка, которую я получаю с сервера после отправки снимка экрана:

java.io.EOFException
    at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at ListeningThread.run(ListeningThread.java:50)
at java.lang.Thread.run(Unknown Source)

Serversocket.accept() продолжает чтение, как только что получил новый запрос от клиента, когда он действительно этого не сделал... вместо того, чтобы останавливаться и ждать нового запроса...

Я застрял с этим в течение двух недель, и очень расстроен.

пожалуйста помоги.

Дэвид.

1 ответ

Решение

В моем случае сервер должен запустить новый поток для обработки каждого принятого соединения, а не обрабатывать каждый поточный в принимающем потоке. Но я также попытался получить первое обновление через serversocket вместо инициализации входа в систему. Теперь, получив первое обновление при входе в систему, я добавил сокет сервера на стороне клиента, чтобы он продолжал прослушивать дальнейшие обновления с сервера.

Идея EJP дала мне первое преимущество.

Другие вопросы по тегам