Как я могу узнать, когда сокет простаивает?
Я пытаюсь написать клиент-серверное приложение. клиенты публикуют запросы на обслуживание, а сервер получает их и отображает в технической комнате.
все было хорошо, пока я не попытался отправить снимок экрана специальному клиенту администратора, который должен получить снимок экрана со списком активных запросов.
Мой основной поток прослушивания сервера выглядит так:
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 дала мне первое преимущество.