|
박정만 님이 쓰신 글 :
: 5000명의 사용자가 서버에 접속했다고 칩시다.
:
: 그러면, Connections[0] 부터 Connections[4999] 까지 소켓으로 차겠지요.
:
: 이중에서 2000번째의 소켓이 "홍길동"의 소켓입니다.
:
: 그런데, 1000번째 소켓이 접속을 해제하여 1999번째의 소켓이 "홍길동" 것으로 되었습니다.
:
: 이제 "홍길동"에게만 특별한 데이타를 보내야하는데, 이럴 경우 어떤 방식으로 "홍길동" 소켓을 찾습니까?
:
: Connections 배열과 1:1로 참조하는 또 다른 인덱스 배열을 만들어야 할까요? 메세지 하나 보낼때 마다 루프문 돌려서 일일히 찾아서 보내려면 시간이 많이 걸리지 않을까요?
:
: 경험 많으신 분의 답변을 부탁드립니다.
"이제 "홍길동"에게만 특별한 데이타를 보내야하는데"
전제가 좀 이상한데요
님의 말대로라면 한명이 나가기전에는 '홍길동'에게 바로 데이타를 보낼 수 있다는 것입니까?
짐작컨데 "Connection[2000]-->홍길동"
1000번째 소켓이 접속을 해제한 것과 '홍길동'에게 데이타를
보내는 것은 별다른 상관관계가 없을 것 같은데요.
어차피 링크드 리스트로 관리를 한다면 리스트에서 검색을 해야할테니까요
그럴경우 1999번째서 찾든 2000번째서 찾든 비슷하니까요.
참고로 다른 얘기를 좀 해보죠.
서치 방법
첫번째,
해쉬 테이블을 만들자,
바로 '홍길동'이란 값을 가지고 검색없이 그 사람에게 데이타를 보내는 방법,
즉 클라이언트'홍길동'에 대한 소켓의 정보를 얻는 방법은 해쉬 키를 이용할 수가 있겠네요.
'홍길동'이란 키값을 이용하여 Socket의 정보(Socket->data)를 가지게 되는 주소영역을
다른 클라이언트들의 영역과 구분되게 할당하면 되지요.
하지만 알고리즘이 무척 어렵겠죠, 자료의 유일성을 보전하기위해선,
두번째,
캐쉬를 두자,
몇 몇 자주 데이타를 보내는 클라이언트들에 대한 정보를 가진 캐쉬를 만들 수가 있겠네요
상황에 따라 실용적일 수도 있지만, 이런 상황은 별로 없겠죠,
세번째,
기타 서치 알고리즘을 쓰자.
예를들어 'ㅎ'으로 시작하는 성을 가진 사람은 Connection[1000]부터 할당한다치면
'홍길동'이란 값을 찾을때 Connection[1000]부터 찾으면 되겠지요
끝으로 소켓은 각각의 클라이언트에 대해 유일한 값을 가져야합니다.
그러니까 처음에 설계를 할때 서버가 가지게될 리스트를 잘 만들어야겠죠
위에서처럼 누군가가 접속해제하는 것에 대해 영향을 받아선 안 되겠죠
덪붙여서 서버가 어떤 상황 발생시마다 특정한 클라이언트에게 데이타를 보내는
일이 많아선 않되겠죠, 공통의 데이타를 클라이언트들에게 보내주는 것이
서버/클라이언트 모델에서 서버의 역할이 아닌가 생각됩니다.
흠, 쓸데없는 말이 많았네요. 도움이 될는지 모르겠습니다.
저또한 아는 바가 없는 초보지만 여기서 도움을 많이 받아 보답코저
아는 대로 썼어요, 틀린 부분도 많을 겁니다. 그냥 제 생각일뿐이고요
그럼 좋은 하루 되세요
|