이 글에서는 이전에 소켓.io의 기본 튜토리얼과 응용 프로그램에 대한 관련 정보를 더 자세히 소개했습니다. 이 글에서는 소켓.io가 필요한 친구들을 더 자세히 소개했습니다. 참고자료로 활용하셔도 좋습니다. 아래에서 살펴보겠습니다.
서문
Socket.io는 이벤트 기반의 실시간 양방향 통신을 제공하는 Socket.io에 대해 자세히 소개합니다. 자세한 내용을 살펴보세요.
정적 파일
socket.io는 기본적으로 소켓.io-client 패키지를 통해 소켓.io.min을 제공합니다. Node.js 및 소켓.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:
let io = require('socket.io')(app, { serveClient: false })
인스턴스화 시 제어 매개변수serveClient 값 false를 전달합니다.방법 2: 호출 함수를 호출하기 전에 serverClient
let app = require('http').createServer() let io = require('socket.io')() io.serveClient(false) io.listen(app) // 或者io.attach(app)
서비스가 바인딩된 경우http.Server
이 메서드는 작동하지 않습니다
비활성화한 후 다시 액세스하면 메시지가 표시됩니다{"code":0,"message":"Transport unknown"}
정적 파일 경로 수정
socket.io.js 경로는 변경 가능하며, 기본 경로는 /socket.io입니다.
인스턴스화 시 매개변수 전달
let io = require('socket.io')(app, { path: '/io' })
함수 경로 호출
let app = require('http').createServer() let io = require('socket.io')() io.path('/io') io.listen(app)
함수를 호출하기 전에 서비스가 바인딩된 경우http.Server
이 방법은 작동하지 않습니다
보안 정책
socket.io는 두 가지 보안 정책을 제공합니다.
allowRequest
allowRequest 함수에는 두 개의 매개변수가 있습니다. 첫 번째 매개변수는 수신된 핸드셰이크 패킷(http.request
) 개체로 판단의 기준으로 사용됩니다. err은 오류 개체, 성공은 부울, false입니다. 차단을 의미합니다. 연결 설정
프런트 엔드 요청이 토큰을 가져옵니다
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는 토큰
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) } });
원본을 기반으로 계속할지 여부를 결정합니다.
소스를 제한할 수 있습니다
1. 인스턴스화 시 소스를 제한합니다
rree2. Origins 함수는 소스를 설정합니다
origins 함수에는 두 가지 형태가 있습니다
origins(string)
: 실행 소스 설정
origins(string, fn(err, success))
: 함수를 사용하여 소스 허용 여부를 확인합니다.
let app = require('http').createServer() let io = require('socket.io')(app, { origins: 'http://localhost:3000' })
네임스페이스
네임스페이스는 서버/클라이언트 연결을 격리하는 데 사용됩니다. 채널. 다음 예에서는 그 중요성을 설명합니다
두 가지 기능이 있는 공동 작업 애플리케이션을 구현해야 합니다.
협업 편집: 여러 사용자가 동시에 문서를 편집할 수 있습니다.
메시지: 사용자는 사용자 간에 메시지를 보낼 수 있습니다.
socket.io를 사용하여 다음과 같은 형태의 이 애플리케이션을 구현합니다.
1. 완전 독립: 공동 편집을 위한 독립 서비스edit.socket.test
, 메시징 시스템을 위한 독립 서비스message.socket.test
io.origins('http://localhost:*') io.origins((origin, cb) => { if (origin === 'http://localhost:3000/') return cb(null, true) cb(null, false) })
2. , 네임스페이스를 통해 격리
let editSocket = io('edit.socket.test') let messageSocket = io('message.socket.test')
3. 이벤트 이름 규칙: 이벤트 이름을 추가하여 격리
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 => { /消息相关 })
이벤트 이름 규칙 절차가 너무 거슬리고 분할 및 재구성에 도움이 되지 않으므로 그렇지 않습니다. 추천합니다. 완전 독립 모드에서는 두 개의 소켓 연결을 사용해야 하므로 브라우저에서 허용하는 동시 연결 수를 낭비하고 더 많은 서버 리소스를 소비합니다. 네임스페이스를 사용하면 리소스를 낭비하지 않고 효과적으로 격리할 수 있습니다.
기본 네임스페이스
socket.io가 인스턴스화되면 경로가 /인 네임스페이스가 자동으로 바인딩됩니다.
let editSocket = io('socket.test/edit') let messageSocket = io('socket.test/message')
미들웨어
socket.io의 네임스페이스는 사용을 통해 미들웨어를 등록하고, 미들웨어가 클라이언트와 서버 간의 연결을 성공적으로 설정한 후 호출됩니다. connet 이벤트가 전달되기 전에 한 번.
데이터 검증을 위해 미들웨어 사용
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 => { }) }
미들웨어를 사용하여 데이터 추출 또는 변환io.use((socket, next) => { <code>io.use((socket, next) => { <br/>getInfo(socket.request.query.id, (err, data) => { if (err) return next(err) socket.custom = data next() }) })
getInfo(socket.request . query.id, (err, data) => { if (err) return next(err) 소켓.custom = data next() }) })
allowRequest 비교
allowRequest를 사용하면 일부 확인 및 추출을 수행할 수 있는데 왜 미들웨어가 필요한가요?
allowRequest 수신 http.request 인스턴스, 미들웨어가 들어가고 데이터 소켓 인스턴스를 종료합니다. 소켓 인스턴스에는 요청 인스턴스가 포함되어 있으며 더 많은 정보가 있습니다
미들웨어는 여러 비동기 프로세스 중첩을 직접 지원하는 반면, AllowRequest는 직접 구현해야 합니다
연결 이벤트와의 비교
연결 이벤트도 소켓에 전달되며, 수치 검증 및 추출에도 사용할 수 있습니다. . 미들웨어가 필요한 이유는 무엇인가요?
미들웨어는 여러 비동기 프로세스의 중첩을 직접 지원하는 반면, 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') })
压缩
socket.compress(true)
启用压缩,调用后当前连接的所有数据在传递给客户端前都会进行压缩
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) {});
위 내용은 node.js의 소켓.io 학습 튜토리얼 소개(3)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!