2014-02-10 5 views
0

Я пытаюсь написать приложение клиентского сервера. клиенты отправляют запросы на обслуживание и сервер получает их и отображает их в техническом зале.Как я могу узнать, когда сокет простаивает?

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

мой основной сервер прослушивания поток выглядит следующим образом:

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 CLIENT и попробуйте отправить его screencapture через поток 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() continutes чтения как только что получил новый запрос от клиента, когда это действительно не ... вместо паузы и ожидания нового запроса ...

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

, пожалуйста, ПОМОЩЬ.

David.

+0

Ваш сервер должен начать новый поток, чтобы обрабатывать каждое принятое соединение, вместо обработки каждого из них в строке в потоке accept. – EJP

+0

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

ответ

0

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

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

Смежные вопросы