socket.io 학습 튜 토리 얼 의 깊이 있 는 학습 편(3)

머리말
socket.io 는 사건 을 바탕 으로 하 는 실시 간 양 방향 통신 을 제공 합 니 다.본 고 는 socket.io 를 깊이 있 게 소개 하 였 습 니 다.다음은 상세 한 내용 을 살 펴 보 겠 습 니 다.
정적 파일
socket.io 는 기본적으로 socket.io-client 패 키 지 를 통 해 socket.io.min.js 와 socket.io.js.map 를 다운로드 합 니 다.
인 스 턴 스 app.js 실행

let app = require('http').createServer() 
let io = require('socket.io')(app)

app.listen(3000); 
브 라 우 저 접근http://localhost:3000/socket.io/socket.io.js압축 된 원본 코드 를 불 러 올 수 있 습 니 다.접근http://localhost:3000/socket.io/socket.io.js.map소스 맵 불 러 오기
우 리 는 이런 행 위 를 바 꿀 수 있다.
socket.io.js 다운로드 사용 하지 않 기
방법 1:실례 화 시 제어 파라미터 서버 클 라 이언 트 값 false

let io = require('socket.io')(app, { 
 serveClient: false
})
방법 2:함수 server Client 호출

let app = require('http').createServer() 
let io = require('socket.io')() 
io.serveClient(false) 
io.listen(app) //   io.attach(app) 
함수 호출 전 서비스 가 연결 되 어 있 으 면 이 방법 은 작 동 하지 않 습 니 다.
사용 하지 않 으 면 다시 방문 하면 알림http.Server정적 파일 경로 수정
socket.io.js 경 로 를 변경 할 수 있 습 니 다.기본 경 로 는/socket.io 입 니 다.
실례 화 시 전 삼

let io = require('socket.io')(app, { 
 path: '/io'
})
호출 함수 path

let app = require('http').createServer() 
let io = require('socket.io')() 
io.path('/io') 
io.listen(app) 
함수 호출 전 서비스 가 연결 되 어 있 으 면 이 방법 은 작 동 하지 않 습 니 다.
보안 정책
socket.io 는 두 가지 보안 정책 을 제공 합 니 다.
allowRequest
함수 allow Request 는 두 개의 매개 변수 가 있 습 니 다.첫 번 째 매개 변 수 는 받 은 악수 팩{"code":0,"message":"Transport unknown"}대상 입 니 다.판단 근거 로 success),err 는 오류 대상 이 고 success 는 boolean 이 며 false 는 연결 을 막 는 것 을 표시 합 니 다.
전단 요청 token 가 져 오기

let socket = io('http://localhost:3000?token=abc') 
socket.on('connect', () => { 
 console.log('connect')
})
socket.on('connect_error', err => { 
 socket.disconnect()
 console.log('connect_error', err)
})
백 엔 드 allowRequest 는 token 에 따라 계속 할 지 여 부 를 판단 합 니 다.

let app = require('http').createServer() 
let io = require('socket.io')(app, { 
 allowRequest: (req, cb) => {
 if (req._query && req._query.token === 'abc') return cb(null, true)
 cb(null, false)
 }
});
origins
소스 를 제한 할 수 있 습 니 다.
1.예화 시 제한 원

let app = require('http').createServer() 
let io = require('socket.io')(app, { 
 origins: 'http://localhost:3000'
})
2.origins 함수 설정 소스
origins 함 수 는 두 가지 형식 이 있 습 니 다.http.Server:실행 중인 원본 설정http.request:함수 로 원본 의 허용 여 부 를 판단 합 니 다.

io.origins('http://localhost:*')

io.origins((origin, cb) => { 
 if (origin === 'http://localhost:3000/') return cb(null, true)
 cb(null, false)
})
이름 공간
이름 공간 은 서버/클 라 이언 트 의 연결 격 리 에 사용 되 며,일부 지역 에 서 는 이름 공간(namespace)을 채널(channel)이 라 고도 부른다.다음은 예 를 들 어 그 의 미 를 설명 한다.
우 리 는 하나의 협동 응용 을 실현 해 야 한다.이 응용 은 두 가지 기능 이 있다.
  • 공동 편집:여러 사용자 가 하나의 문 서 를 동시에 편집 할 수 있다
  • 메시지:사용자 간 에 메 시 지 를 보 낼 수 있 습 니 다.
  • socket.io 로 이 응용 을 실현 하려 면 다음 과 같은 몇 가지 형식 이 있 습 니 다.
    1.완전 독립:공동 편집 은 독립 된 서비스origins(string)가 있 고 정보 시스템 은 독립 된 서비스origins(string, fn(err, success))가 있다.
    
    let editSocket = io('edit.socket.test') 
    let messageSocket = io('message.socket.test') 
    2.이름 공간:하나의 독립 된 서비스 만 실행 하고 이름 공간 을 통 해 격 리 합 니 다.
    
    let app = require('http').createServer() 
    let io = require('socket.io')(app) 
    let editServer = io.of('/edit') 
    let messsageServer = io.of('/message') 
    editServer.on('connection', socket => { 
     //    
    })
    messsageServer.on('connection', socket => { 
     /    
    })
    
    let editSocket = io('socket.test/edit') 
    let messageSocket = io('socket.test/message') 
    3.이벤트 이름 약속:이벤트 이름 추가 로 격 리
    
    let app = require('http').createServer() 
    let io = require('socket.io')(app)
    
    io.on('connection', socket => { 
     //    
     io.emit('edit:test')
     io.on('edit:test', data => {
    
     })
     //    
     io.emit('message:test')
     io.on('message:test', data => {
    
     })
    }
    사건 명 약정 절 차 를 통 해 침입 성 이 너무 커서 분할 과 재 구성 에 불리 하고 추천 하지 않 습 니 다.완전히 독립 된 모드 는 브 라 우 저가 허용 하 는 병렬 연결 수 를 낭비 하고 서버 자원 을 더 많이 소모 하 는 두 개의 socket 연결 을 사용 해 야 한다.이름 공간 을 사용 하면 좋 은 격 리 를 실현 할 수 있 고 자원 에 낭 비 를 주지 않 습 니 다.
    기본 이름 공간
    socket.io 실례 화 시 자동 귀속 경로/의 이름 공간
    
    let app = require('http').createServer() 
    let io = require('socket.io')(app)
    
    io.sockets // io.of('/').sockets 
    io.emit //   io.of('/').emit,      'to', 'in', 'use', 'send', 'write', 'clients', 'compress' 
    중간 부품
    socket.io 의 이름 공간 은 use 를 통 해 미들웨어 를 등록 합 니 다.미들웨어 는 클 라 이언 트 와 서버 가 연결 되 었 을 때 connet 이벤트 가 발송 되 기 전에 한 번 호출 됩 니 다.
    미들웨어 데이터 검증 이용
    
    io.use((socket, next) => { 
     if (socket.request.headers.cookie) return next()
     next(new Error('Authentication error'))
    })
    중간 부품 을 이용 하여 데 이 터 를 추출 하거나 변환edit.socket.testallowRequest 와 비교
    allowRequest 는 검사,추출 을 할 수 있 습 니 다.왜 미들웨어 가 필요 합 니까?
  • allowRequest 가 들 어 오 는 http.request 인 스 턴 스,미들웨어 출입 데이터 socket 인 스 턴 스,socket 인 스 턴 스 는 request 인 스 턴 스 를 포함 하고 더 많은 정보
  • 가 있 습 니 다.
  • 미들웨어 는 여러 개의 비동기 프로 세 스 를 직접 지원 하 며,allowRequest 는 스스로 실현 해 야 합 니 다.
  • connection 이벤트 와 비교
    connection 이벤트 도 socket 에 들 어 갑 니 다.수 검 사 를 할 수도 있 습 니 다.추출 을 할 수도 있 습 니 다.왜 미들웨어 가 필요 합 니까?
  • 미들웨어 는 여러 개의 비동기 프로 세 스 를 직접 지원 하고 allowRequest 는 스스로 실현 해 야 합 니 다
  • 미들웨어 가 성공 한 후에 connection 이벤트 가 발송 되 기 전에 socket.io 는 socket 인 스 턴 스 를 connected 대상 에 추가 하고 채 팅 방 에 가입 하 는 등 작업 도 했다.권한 이 연결 을 중단 하면 미들웨어 에서 자원 을 더 절약 합 니 다.
  • 채 팅 방
    채 팅 방 은 현재 연 결 된 socket 집합 을 특정 규칙 에 따라 그룹 으로 구성 하여 단체 로 메 시 지 를 보 내 는 데 편리 합 니 다.QQ 군 을 비교 할 수 있 는 확률 입 니 다.
    
    socket.join('room name') //   
    socket.leave('room name') //   
    
    io.to('some room').emit('some event') // io.to io.in  ,               
    기본 채 팅 방
    모든 socket 은 연결 에 성공 하면 자동 으로 기본 채 팅 방 을 만 듭 니 다.이 채 팅 방 의 이름 은 현재 socket 의 id 입 니 다.기본 채 팅 방 을 통 해 특정 사용자 에 게 메 시 지 를 보 낼 수 있 습 니 다.
    
    socket.on('say to someone', (id, msg) => { 
     socket.broadcast.to(id).emit('my message', msg)
    })
    메시지 전송
    응답 메시지
    일반 메 시 지 는 응답 할 필요 가 없 으 며,응답 메 시 지 는 응답 체 제 를 제공 합 니 다.
    
    io.on('connection', socket => { 
     socket.emit('an event', { some: 'data' }) //    
    
     socket.emit('ferret', 'tobi', function (data) { //    
     console.log(data); // data will be 'woot'
     })
    })
    
    socket.on('ferret', (name, fn) => { 
     fn('woot')
    })
    압축 하 다.message.socket.test압축 을 사용 합 니 다.호출 후 현재 연 결 된 모든 데 이 터 는 클 라 이언 트 에 게 전달 되 기 전에 압축 됩 니 다.
    volatile 표지
    socket.io 는 정상 적 인 상황 에서 보 낸 메 시 지 를 추적 하여 메 시 지 를 성공 적 으로 보 낼 수 있 도록 합 니 다.volatile 을 설정 한 후 메 시 지 를 보 냅 니 다.socket.io 는 메 시 지 를 추적 하지 않 고 메 시 지 를 잃 어 버 릴 수 있 습 니 다.
    분류 하 다.
    
    //        
    socket.emit('hello', 'can you hear me?', 1, 2, 'abc');
    
    //          (    )    
    socket.broadcast.emit('broadcast', 'hello friends!');
    
    //  game       ,    
    socket.to('game').emit('nice game', "let's play a game");
    
    //    game1 game2       ,    
    socket.to('game1').to('game2').emit('nice game', "let's play a game (too)");
    
    //  game           
    io.in('game').emit('big-announcement', 'the game will start soon');
    
    //      <socketid>   
    socket.to(<socketid>).emit('hey', 'I just met you');
    
    //       
    socket.emit('question', 'do you think so?', function (answer) {}); 
    총결산
    이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기