2012-11-27 2 views
1

내가 가지고있는 아이디어는 클라이언트가 서버의 대화방에 연결하고 서로 통신 할 수 있다는 것입니다. 대화방에서 다른 사용자를 타겟팅 할 수 있어야하며 서로 대화 할 수 있어야합니다.서버/클라이언트 채팅

문제가 생겼습니다. 이 방법을 구현하는 가장 쉽고/좋은 방법은 확실하지 않습니다. 사용자가 무언가를 쓸 때 생각한 대화방에서 메시지는 서버로 보내지고 서버는 그 메시지를 다른 클라이언트에게 보낸다. 내가 가지고있는 다른 옵션이 무엇인지 모릅니다. 난에 대한 가장 혼란 스러워요 무엇

내가 단지 2 클라이언트가 서로 대화 할 수있는 방법입니다. 서버가 프록시 역할을하고 메시지를 다른 클라이언트로 전달하는 경우에는 비효율적 인 것처럼 보입니다. 내가 생각할 수있는 유일한 대안은 2 명의 클라이언트가 서로간에 연결을 설정한다는 것입니다. 어떤 구현이 이것을 달성하기 위해 가장 일반적입니까?

저는 C++에서 유닉스 소켓을 사용하고 있습니다.

+0

클라이언트 뒤에있는 NAT는 무엇입니까? Skype를 재발견하고 싶습니다 ... : P2P와 클라이언트 - 서버 이후 D Google – neagoegab

답변

1

다자간 채팅 및 일대일 채팅을위한 몇 가지 옵션이 있습니다. 그러나 다 대다 채팅에 대한 합리적으로 정상적인 옵션은 메시지를 중앙 집중식 서버로 보내면 서버는 연결된 모든 다른 클라이언트 (또는 같은 "방"/"채널").

일대일 채팅의 경우 똑같은 모델을 따르는 것이 좋습니다. 즉, 메시지가 서버에서 프록시로 전송되는 많은 수의 채팅 릴레이의 특별한 경우 일뿐입니다 다른 하나의 연결된 클라이언트. 이것은 간단하며 모든 클라이언트의 IP 주소를 숨 깁니다.

그러나 일대일 통신이 채팅 (예 : 파일 전송)보다 더 방대한 양이 될 경우 일대일 직접 대면 통신이 적절할 수 있습니다. 이 경우 서버는 원격 사용자에게 직접 피어 투 피어 통신 채널의 초기화를 릴레이하여 설치시 IP 주소를 교환해야하며 클라이언트는 특수 목적의 직접 통신을 위해 서로 직접 연결해야합니다 (대개 선택적이지만 서버에 연결된 채로 있음).

따라서 일대일 통신은 일반적으로 다 대다의 일반적인 경우와 같이 서버에 의해 프록시되며 해당 연습이 비효율적 인 정도는 피상적입니다. 특수 목적 일대일 통신 (파일 전송, VoIP 등)은 일반적으로 서버에 의해 최초로 조정 된 (즉, 직접 통신을 위해 각면을 준비하는) 직접 클라이언트 대 클라이언트 연결을 통해 수행됩니다.

구현 힌트 : 서버가 모두 TCP입니다. 비 블로킹 소켓, POSIX 시스템 콜 poll에 대해 읽고, TCP를 통한 메시지 프레이밍에 대한 생각을 머리 속에 두도록하십시오. 그런 다음 서버 코드에서 다중 스레딩 및 확장 성 문제를 건너 뛸 수 있습니다. 클라이언트는 서버와 동일한 사용자 지정 TCP 프로토콜을 사용하는 것 외에도 사용자가 결정합니다.

1

그럼 멀티 스레드 클라이언트/서버를 구현할 수 있습니다. 메시지를 중계하는 단일 "서버"가 올바른 방법입니다 (메시지의 전역 순서를 보존하기 위해). 또한 "서버"가 다운 된 경우를 대비하여 리더 선거 알고리즘 (http://en.wikipedia.org/wiki/Bully_algorithm)을 생각해보십시오. 신호 및 이벤트 기반 프로그래밍을 사용하는 것이 작업을 수행하는 또 다른 방법을

확인합니다.