Node.js 기반 웹 소켓 통신 구현

4180 단어 nodejswebsocket
node 의존 패키지
node 에서 Websocket 을 실현 하 는 의존 패 키 지 는 매우 많 습 니 다.websocket,ws 가 모두 가능 합 니 다.본 고 는 ws 를 선택 하여 실현 하고 먼저 의존 도 를 설치 합 니 다.

npm install ws
채 팅 방 실례
만약 에 A,B,C,D 사용자 가 클 라 이언 트 를 통 해 Websocket 서비스 에 연결 된다 면 그 중에서 모든 사람 이 보 낸 메 시 지 는 Websocket 을 통 해 다른 사람 에 게 전달 해 야 한다.이 장면 은 서버 에서 A 의 메 시 지 를 팀 내 다른 사용자 에 게 방송 하 는 것 과 유사 하 다.
서버 구현
먼저 서버 프로그램 을 살 펴 보고 구체 적 인 워 크 플 로 는 다음 과 같은 몇 단계 로 나 뉜 다.
  • 웹 소켓 서버 서 비 스 를 만 들 고 8080 포트 의 연결 요청 을 감청 합 니 다.
  • 새로운 클 라 이언 트 가 이 웹 소켓 에 연결 할 때마다 이 연결 push 를 연결 풀 의 배열 에 연결 합 니 다.
  • message 사건 을 감청 하고 이 사건 이 발생 했 을 때 연결 탱크 를 옮 겨 다 니 며 연결 단위 로 해당 하 는 클 라 이언 트 에 이 메 시 지 를 전달 합 니 다
  • close 사건 을 감청 하고 이 사건 이 발생 했 을 때 이 연결 을 연결 탱크
  • 에서 옮 깁 니 다.
    서버 코드
    
    var WebSocketServer = require('ws').Server,
      wss = new WebSocketServer({port: 8080});
    
    //    
    var clients = [];
    
    wss.on('connection', function(ws) {
      //          
      clients.push(ws);
      ws.on('message', function(message) {
        //     
        clients.forEach(function(ws1){
          if(ws1 !== ws) {
            ws1.send(message);
          }
        })
      });
    
      ws.on('close', function(message) {
        //      ,       
        clients = clients.filter(function(ws1){
          return ws1 !== ws
        })
      });
    });
    
    
    클 라 이언 트 구현
    
    <html>
    <input type="text" id="text">
    <input type="button" onclick="sendMessage()" value="online">
    <script>
      var ws = new WebSocket("ws://localhost:8080");
    
      ws.onopen = function (e) {
        console.log('Connection to server opened');
      }
      ws.onmessage = function(event) { 
        console.log('Client received a message', event); 
      }; 
      ws.onclose = function (e) {
        console.log('connection closed.');
      }
      function sendMessage() {
          ws.send(document.getElementById('text').value);
      }
    </script>
    </html>
    
    
    어떻게 사용 자 를 발견 합 니까?
    상기 demo 를 통 해 알 수 있 듯 이 웹 소켓 은 모두 연결 을 바탕 으로 한다.즉,우 리 는 data 가 그 connection 에서 보 내 온 것 을 알 지만 클 라 이언 트 를 사용 하 는 것 이 리 레이 나 한 매 매 매 라 는 것 을 모 르 면 어떻게 해 야 합 니까?또 다른 장면 을 생각하면 리 레이 는 한 매 매 에 게 만 메 시 지 를 보 내 고 다른 클 라 이언 트 에 게 메 시 지 를 방송 하고 싶 지 않다.이때 우 리 는 서버 에서 사용자 의 신분 과 연결 의 대응 관 계 를 표시 할 수 있어 야 한다.
    그래서 클 라 이언 트 가 웹 소켓 에 연결 한 후에 다시 한 번 요청 을 해서 서버 에 내 user 를 알려 야 합 니 다.id 가 얼마 인지 서버 에서 이 userid 와 connection 간 의 관 계 는 hashmap 에 저장 되 어 있 으 며,이로써 userid 와 connection 의 대응 관계.대응 하 는 클 라 이언 트 에 게 메 시 지 를 보 내야 할 때 hashmap 에서 해당 하 는 사용자 의 connection 정 보 를 꺼 내 send 방법 으로 메 시 지 를 보 내 면 됩 니 다.
    의존 가방
    
    npm install hashmap
    서버 구현
    
    var WebSocketServer = require('ws').Server, webSocketServer = new WebSocketServer({port: 8080});
    var HashMap = require('hashmap');
    
    // record the client
    var userConnectionMap = new HashMap();
    var connectNum = 0;
    
    // connection
    webSocketServer.on('connection', function(ws) {
      ++ connectNum;
      console.log('A client has connected. current connect num is : ' + connectNum);
      ws.on('message', function(message) {
        var objMessage = JSON.parse(message);
        var strType = objMessage['type'];
    
        switch(strType) {
          case 'online' : 
            userConnectionMap.set(objMessage['from'], ws);
            break;
          default:
            var targetConnection = userConnectionMap.get(objMessage['to']);
            if (targetConnection) {
              targetConnection.send(message);
            }
        }
      });
    
      ws.on('close', function(message) {
        var objMessage = JSON.parse(message);
        userConnectionMap.remove(objMessage['from']);
      });
    });
    
    
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기