2013-10-18 8 views
0

클라이언트, 서버 기반 채팅을 쓰고 있습니다. 서버는 중앙 구성 요소이며 모든 들어오는 메시지와 나가는 메시지를 처리합니다. 클라이언트는 채팅 사용자입니다. 그들은 프레임에서 채팅을보고 채팅 메시지를 쓸 수도 있습니다. 이 메시지는 서버로 전송됩니다. 서버는 차례로 모든 클라이언트를 업데이트합니다.동기화 : 클라이언트, 서버 채팅

제 문제는 클라이언트 동기화입니다. 서버가 멀티 스레드이기 때문에 두 메시지를 클라이언트에서 수신 할 수 있고 (메시지 형태로) 업데이트를 보내야합니다. 각 클라이언트는 자체 스레드에서 업데이트되기 때문에 모든 클라이언트가 동일한 메시지를 수신 할 것이라는 보장은 없습니다. 우리에게는 짜증나는 문제가 있습니다.

어떻게 해결할 수 있습니까?

나는 타임 스탬프와 버퍼를 망쳤습니다. 그러나 이것은 좋은 해결책이 아닙니다. 왜냐하면 타임 스탬프를 할당 한 후 즉시 메시지가 버퍼에 저장된다는 보장이 없기 때문입니다.

나는 클라이언트를 모른다 고 추가 할 것이다. 즉, 서버의 각 스레드에 하나의 열린 연결 만 있습니다. 나는 모든 클라이언트를 추적 할 클라이언트 배열을 가지고 있지 않습니다.

답변

0

각 클라이언트 프록시 (클라이언트와의 통신을 관리하는 개체)마다 큐를 구현하는 것이 좋습니다. 서버 개체 (자체 스레드)의 각 반복 작업 : 1. 먼저 모든 클라이언트 프록시의 큐에서 메시지를 읽습니다. 2. 내부 논리 및 들어오는 메시지를 기반으로 메시지를 보내야하는지 결정합니다. 3. 보내는 메시지를 준비하고 모든 클라이언트 프록시의 대기열에 넣습니다.

클라이언트 프록시 스레드 작업 일정은 다음과 같습니다. 1. 통신에서 읽습니다. 2. 클라이언트 프록시에서 서버로 대기열에 씁니다 (메시지가 수신 된 경우). 3. 서버에서 클라이언트 프록시로 대기열을 읽습니다. 4. 필요한 경우 통신 채널에 클라이언트에 씁니다.

각 대기열에 뮤텍스가 있어야 할 수 있습니다. 희망하는 사람