2014-02-10 3 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); 
    } 
} 

클라이언트가 데이터로 "로그인"을 전송, I 그를 ADMIN CLIENT로 취급하고 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 :

내가 서버에서 얻을 오류입니다, 화면 캡처를 보낸 후 그것은 정말로하지 못했습니다 ... 새로운 요청을 일시 중지하고 대기하는 대신 ...

저는 2 주 동안 이걸 붙잡고 매우 좌절했습니다.

주세요.

데이비드.

+0

서버는 승인 스레드에서 각 스레드를 인라인으로 처리하는 대신 허용 된 모든 연결을 처리하기 위해 새 스레드를 시작해야합니다. – EJP

+0

나는 이렇게함으로써 문제의 일부를 해결할 수 있었다. 첫 번째 클라이언트 로그인에서 모든 것이 올바르게 작동합니다. 이제 클라이언트에 변경 사항이있을 때 ** 서버 **에서 업데이트를 초기화하는 방법을 찾고 있습니다. 그렇게하려면 클라이언트에 serversocket을 추가해야합니까? 아니면 그렇게 할 수있는 더 우아하고 다른 방법이 있습니까? –

답변

0

필자의 경우 서버는 승인 된 스레드에서 인라인으로 처리하는 대신 모든 허용 된 연결을 처리하기 위해 새 스레드를 시작해야합니다. 하지만 로그인 초기화 대신 serversocket을 통해 첫 번째 업데이트를 가져 오려고했습니다. 이제 로그인하는 동안 첫 번째 업데이트를 얻은 후 서버에서 추가 업데이트를 계속 수신 할 수 있도록 클라이언트 측에 서버 소켓을 추가했습니다.

EJP의 아이디어는 저에게 첫 번째 리드를주었습니다.

관련 문제