2011-08-09 10 views
1

소켓을 사용하여 만든 클라이언트/서버 응용 프로그램이 있습니다. 문제는 일부 정보를 요청하는 명령을 보내고 회신을 기다릴 때까지 차단한다는 것입니다. 따라서 양방향 요청/응답을 구현하기가 더 어려워집니다. 나 하나의 예를 사용하여 설명하자 클라이언트가 서버의 디렉토리에있는 파일을 나열 할 수 있습니다를, 그래서 코드에서 그렇게가 someting를 수행클라이언트/서버 대화 - 잘못 했습니까?

클라이언트 코드 : 1 전송 요청 명령 : LS/ 2 블록 LS 응답 기다리는 중. 3 파일 목록을 가져옵니다.

내가 한 이유는 클라이언트가 파일을 전송해야 할 수 있으므로 다음과 같습니다. 1- 파일 전송 요청 보내기. 2 서버가 수락하는지보기 위해 기다리는 read() 블록. 3이 경우에만 파일을 보내십시오.

그래서 서버에 기능을 요청할 수있을 때까지는 아무 문제가 없었습니다. 내 코드에서 클라이언트는 아무 것도 요청하지 않고 응답을 기다리는 것을 막을 수 있습니다. 그런 다음 서버는 클라이언트가 기다리고있는 응답에 아무런 의미가없는 요청 명령을 보낼 수 있습니다. 이것은 대화를 망칠 것입니다.

한 가지 해결책은 결코 응답을 차단하는 것이 아닙니다. 요청 명령을 보내고 응답이 도착하면 서버에서 어떤 요청이나 응답도 기다려야합니다. 응답이 도착하면 파일을 보냅니다. 그렇다면 각 요청/응답 쌍에 ID와 같이 추가해야 어떤 요청이 어떤 응답인지 알 수 있습니까?

추 신 : 호스트 간의 네트워크 대화를 디자인하는 방법에 대해 꽤 분실되어 있으며 네트워크 응용 프로그램의 패턴에 대한 책을 읽지 않았습니다.

PS2 : 내 나쁜 영어 SRY)

+0

그냥 정보를 추가하려면 ... 내 모든 메서드는 그와 같은 (Java) 클래스 클라이언트가 있습니다 : public List listRemoteDir (String dir) 예외를 throw합니다 올바른 메시지를 얻으려면 – fredcrs

답변

0

당신이 찾고있는 것은 서버와 클라이언트 사이의 응용 프로그램 수준 protocol입니다.

가장 간단한 방법은 서버가 다음에 보낼 내용을 미리 지정하는 것입니다. 메시지 앞에 메시지 유형 바이트를 넣으십시오. 말하는 0 의미, 1 응답을 의미합니다. switch 진술에 스틱 그러면 완료되었습니다.

메시지 길이를 헤더에 포함하는 것이 좋습니다. 수신 코드는 완전한 메시지를 얻기 위해 네트워크에서 가져올 바이트 수를 알고 있습니다.

+0

문자열 구분 기호를 사용합니다. \ r \ n ISO-8859-1로 인코딩 됨 .... 양방향으로 작업하면 List와 같은 클라이언트에서 메소드를 구현할 수 없습니다. listRemoteDir (String dir)은 내가 할 것인가? – fredcrs

+0

구분 된 메시지도 괜찮습니다. 메시지 시작 부분에 message * type *를 포함시키는 방법이 필요합니다. 말하자면 첫 번째 단어/토큰이 유형이라고합시다. 예를 들어, HTTP에서 보면, 첫 번째 토큰은 HTTP "메소드"- GET, POST 등입니다. 실제로 메시지 유형입니다. –

+0

나는 그것을 시도 할 것이다. 또한 클래스에서 사람들이 wrapin 메시지를 읽었습니다. 좋은 연습입니까? – fredcrs

관련 문제