소켓 기반의 채팅방 실현 원리

6235 단어 socket

소켓 기반의 채팅방 실현 원리


복건 천주 데이터 통신국 임천산([email protected]





---Socket 채팅방의 기본 원리는 OGI와 WW 서버를 버리고 HTML규범에 따라 브라우저의 요청을 받은 후 WWW 서버의 응답을 모방하여 채팅 내용을 브라우저로 보내는 것이다.브라우저가 보기에 마치 거대한 페이지를 훑어보는 것처럼 시종 페이지 연결 상태에 있다. 이것이 바로 전문적인 채팅 서버이고 간소화된 WWW 서버이다.


--- 이렇게 하면 CGI 방식에 비해 Socket 채팅방의 장점이 뚜렷하다:


  1. 는 전문적인 WWW 서버가 필요하지 않으며, 채팅 서버에서 필요한 작업을 완성하고, 시간이 소모되는 CGI 과정을 피한다.
  2. 단일 프로세스 서버를 사용하면 매번 새로운 프로세스가 생길 필요가 없습니다.
  3. 데이터 교환은 완전히 메모리에서 진행되며 파일을 읽거나 쓸 필요가 없습니다.
  4. 는 정해진 시간에 리셋할 필요가 없습니다. 화면의 깜박임을 줄이고 서버에 대한 요청 횟수를 줄일 수 있습니다.


---구체적인 실현 절차를 살펴봅니다.


1. 채팅 서버 구현 절차


--- 다음 그림은 서버 프로그램 프로세스입니다.


---위 그림의'사용자 입력 처리'부분은 다음 그림으로 세분화할 수 있습니다:



--- 사용자 데이터 입력은 모두 URL을 통해 전송됩니다. 다음은 몇 개의 URL 실례입니다. 다음 클라이언트 프로세스와 결합하면 시스템 구조를 더욱 잘 이해할 수 있습니다.


---이것은 사용자 이름 비밀번호가'aa'인 채팅 사용자가 시스템에 로그인하여'hello'라고 한 다음에 발생하는 일련의 요청을 종료합니다. 그 중에서 비밀번호는 시스템 함수crypt로 암호화되었습니다:

    /login?name=aaa&passwd=PjHIIEleipsEE    /chat?sid=ZUyPHh3TWhENKsICnjOv&passwd=PjHIIEleipsEE    /talk?sid=ZUyPHh3TWhENKsICnjOv&passwd=PjHIIEleipsEE    /names?sid=ZUyPHh3TWhENKsICnjOv/doTalk?sid=ZUyPHh3TWhENKsICnjOv &passwd=PjHIIEleipsEE&message=hello    /leave?sid=ZUyPHh3TWhENKsICnjOv&passwd=PjHIIEleipsEE

2. 클라이언트의 구체적인 로그인 과정


--- 채팅창 보기:


--- 채팅 인터페이스는 세 개의 프레임으로 구성되어 있는데 그 중에서 채팅 프레임은 채팅 내용의 표시 부분이고 토크 프레임은 사용자의 입력 부분이다. 채팅 내용의 입력, 동작, 필터와 관리 기능을 포함하여 모두 이 프레임에 입력되고names는 온라인 명단의 표시 부분이며 이 부분은 정해진 시간에 리셋된다.


---브라우저의 관점에서 채팅방에 들어가는 과정을 봅시다.


---- 1.먼저 브라우저 요청 페이지:
---http://host:9148/login?name=NAME&passwd=PWD


---이때 서버 채팅 포트에 연결된 Socket 연결이 생겼고 데이터를 보냈습니다:
---GET/login?name=NAME&passwd=PWD HTTP/1.1


----2.서버에서 session ID를 생성하여 암호를 확인한 후 반환:

    HTTP/1.1 200 OK    < >    Content-TYPE: text/html    < >        ……                ……    

--- 그리고 서버가 Socket 연결을 닫습니다.


----3.브라우저는 상기 html 파일을 받은 후 세 개의 연결을 차례로 열 것입니다(그중 $sid와 $encrypt_pass는 변수입니다):

    /chat?sid=$sid&passwd=$encrypt_pass     /talk?sid=$sid&passwd=$encrypt_pass     /names?sid=$sid

--- 이 세 개의 연결 중의 첫 번째 연결 채팅은 전체 채팅 과정에서 연결을 유지한다. 이렇게 하면 브라우저의 측면에서 볼 때 시종 다운로드가 끝나지 않는 큰 페이지이다. 표시 효과는 채팅 내용이 갱신으로 업데이트되는 것이 아니라 끊임없이 위로 굴러가는 것이다.html 코드를 살펴보면 알 수 있듯이 <만 있습니다.html >< body >,그 다음은 끊임없이 증가하는 채팅 내용입니다.body ></html >.


---다른 두 개의 연결이 페이지에서 발송된 후에 Socket이 닫힙니다.


---이렇게 한 번 채팅방에 로그인하면 실제로 네 번의 Socket 연결이 있지만, 로그인이 끝난 후에는chat 프레임의 Socket만 연결을 유지하고 서버에서 온 채팅 정보를 수신하는 데 사용되며, 이것이 Socket 채팅방의 관건이다.

---서버에 채팅에 참가하는 모든 고객의 채팅 소켓을 저장하고, 누군가가 발언할 때 서버는 모든 채팅 소켓에 채팅 내용을 발송합니다.


---토크와names 프레임의 html는 실제적으로 일반form과 같다.


---- 4.사용자가 로그인한 후, 서버 측은 사용자 정보를 포함하는 표를 저장했다:


---perl 구현에서 우리는 해시 구조로 정보를 저장하고session ID를 키 인덱스로 합니다.이러한 저장 구조는 데이터를 액세스하고 공간을 회수하는 데 편리하다.모든 고객 정보는 하나의 그룹입니다.

    [socket,name,passwd,privilige,filter,login_time,color]    socket: chat socket     name:     passwd:     privilige:     filter: (reference)    login_time: ,     color: 

--- 이상의 사용자 데이터는 대부분login 단계에서 사용자가 비밀번호 검증을 통해 입력한 것입니다.chat Socket은 chat 프레임이 표시될 때까지 기다려야 얻을 수 있습니다.일정 시간이 지나도 Socket을 입력하지 않으면 브라우저가 메인 프레임워크를 가져간 후 연결이 끊겼습니다. 이때 사용자 데이터를 삭제해야 합니다.


--- 이상은 채팅방의 핵심 부분입니다. 다른 부분, 예를 들어 사용자 등록, 비밀번호 변경 등은 CGI 채팅방 코드를 그대로 사용할 수 있습니다.


3. 개선이 필요한 곳


---는 현재 채팅, 귓속말, 동작 등 기본적인 채팅 기능과 사용자 명단을 필터하는 추가 기능을 제공합니다.관리 기능은 사람을 차고, IP를 조사하고, 실주를 임명하는 것을 완성했다.앞으로 개선해야 할 점은 다음과 같습니다.

--- 안정성: 현재 채팅방은 아직 큰 사용자 테스트를 거치지 않았기 때문에 안정성을 충분히 보장할 수 없습니다.단일 프로세스 순환 서버이기 때문에, 어떤 사용자의 통신 자물쇠는 모든 사람을 자물쇠로 만들 것이다.만약 동시 다중 프로세스 서버를 사용한다면 안정성을 높일 수 있다.그러나 이런 시스템은 서버 자원에 대한 소모도 매우 많을 것이다.


--- 기능: 채팅방을 만드는 등 기능이 아직 완성되지 않았습니다. 이런 외곽 기능은 안정성이 보장된 후에 비교적 쉽게 가입할 수 있습니다.


function adbn(sname,pname) {var Jtoday= new Date();jt=Jtoday.getTime();var tilex='';var catex='';var sizex='1x1';var w=1;h=1;var adname='.cn';document.write('<table border=0><tr><td>');document.write('<A HREF="http://ad'+adname+'.doubleclick.net/jump/'+sname+pname+';sz='+sizex+';'+catex+tilex+'ord='+jt+'?"target=_blank><IMG SRC="http://ad'+adname+'.doubleclick.net/ad/'+sname+pname+';sz='+sizex+';'+catex+tilex+'ord='+jt+'?"border=0 height="'+h+'"width="'+w+'"></A>');document.write('</td></tr></table>');}
adbn('www.ccw.com.cn/','week');











Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=3492






좋은 웹페이지 즐겨찾기