클라이언트 서버 응용 프로그램을 작성하려고합니다. 클라이언트가 서비스 요청을 게시하고 서버가이를 수신하여 기술실에 표시합니다.소켓이 유휴 상태 일 때 어떻게 알 수 있습니까?
라이브 요청 목록의 화면 캡처를 수신해야하는 특별한 관리 클라이언트로 화면 캡처를 보내려고 시도 할 때까지 모든 것이 정상적이었습니다.
내 주요 서버 청취 스레드는 다음과 같습니다
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 주 동안 이걸 붙잡고 매우 좌절했습니다.
주세요.
데이비드.
서버는 승인 스레드에서 각 스레드를 인라인으로 처리하는 대신 허용 된 모든 연결을 처리하기 위해 새 스레드를 시작해야합니다. – EJP
나는 이렇게함으로써 문제의 일부를 해결할 수 있었다. 첫 번째 클라이언트 로그인에서 모든 것이 올바르게 작동합니다. 이제 클라이언트에 변경 사항이있을 때 ** 서버 **에서 업데이트를 초기화하는 방법을 찾고 있습니다. 그렇게하려면 클라이언트에 serversocket을 추가해야합니까? 아니면 그렇게 할 수있는 더 우아하고 다른 방법이 있습니까? –