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)이 라 고도 부른다.다음은 예 를 들 어 그 의 미 를 설명 한다.
우 리 는 하나의 협동 응용 을 실현 해 야 한다.이 응용 은 두 가지 기능 이 있다.
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.test
allowRequest 와 비교allowRequest 는 검사,추출 을 할 수 있 습 니 다.왜 미들웨어 가 필요 합 니까?
connection 이벤트 도 socket 에 들 어 갑 니 다.수 검 사 를 할 수도 있 습 니 다.추출 을 할 수도 있 습 니 다.왜 미들웨어 가 필요 합 니까?
채 팅 방 은 현재 연 결 된 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) {});
총결산이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Node JS] 웹 채팅 / socket.io 구현Node JS와 socket.io를 이용해 웹 채팅을 구현했다. 서버에서 나머지 클라이언트1을 제외한 나머지 클라이언트에 채팅 내용을 보내준다. ▼chat.html▼ http://localhost:8080/chat경...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.