> 웹 프론트엔드 > JS 튜토리얼 > node.js의 소켓.io 학습 튜토리얼 소개(3)

node.js의 소켓.io 학습 튜토리얼 소개(3)

零下一度
풀어 주다: 2017-05-03 10:02:19
원래의
1167명이 탐색했습니다.

이 글에서는 이전에 소켓.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. 인스턴스화 시 소스를 제한합니다

rree

2. 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')
로그인 후 복사
rrree

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(&#39;room name&#39;) //进入 
socket.leave(&#39;room name&#39;) //退出
로그인 후 복사
io.to(&#39;some room&#39;).emit(&#39;some event&#39;) // io.to与io.in同义,向某个聊天室的所有成员发送消息
로그인 후 복사

默认聊天室

每个socket在连接成功后会自动创建一个默认个聊天室,这个聊天室的名字是当前socket的id,可以通过默认聊天室实现向特定用户发送消息

socket.on(&#39;say to someone&#39;, (id, msg) => { 
 socket.broadcast.to(id).emit(&#39;my message&#39;, msg)
})
로그인 후 복사

消息发送

应答消息

普通消息不需要回应,而应答消息提供了应答机制

io.on(&#39;connection&#39;, socket => { 
 socket.emit(&#39;an event&#39;, { some: &#39;data&#39; }) //普通消息

 socket.emit(&#39;ferret&#39;, &#39;tobi&#39;, function (data) { //应答消息
 console.log(data); // data will be &#39;woot&#39;
 })
})
로그인 후 복사


socket.on(&#39;ferret&#39;, (name, fn) => { 
 fn(&#39;woot&#39;)
})
로그인 후 복사

压缩

socket.compress(true)启用压缩,调用后当前连接的所有数据在传递给客户端前都会进行压缩

volatile标志

socket.io在正常情况下对发送的消息进行追踪,确保消息发送成功,而设置volatile后发送消息,socket.io不会对消息追踪,消息可能丢失

分类

// 客户端发送消息
socket.emit(&#39;hello&#39;, &#39;can you hear me?&#39;, 1, 2, &#39;abc&#39;);

// 向所有连接的客户端(除了自己)发送消息
socket.broadcast.emit(&#39;broadcast&#39;, &#39;hello friends!&#39;);

// 向game聊天室发送消息,自己不算
socket.to(&#39;game&#39;).emit(&#39;nice game&#39;, "let&#39;s play a game");

// 同时向game1和game2聊天室发送消息,自己不算
socket.to(&#39;game1&#39;).to(&#39;game2&#39;).emit(&#39;nice game&#39;, "let&#39;s play a game (too)");

// 向game聊天室的所有人发送消息
io.in(&#39;game&#39;).emit(&#39;big-announcement&#39;, &#39;the game will start soon&#39;);

// 发送消息到<socketid>客户端
socket.to(<socketid>).emit(&#39;hey&#39;, &#39;I just met you&#39;);
// 发送应答消息
socket.emit(&#39;question&#39;, &#39;do you think so?&#39;, function (answer) {});
로그인 후 복사

위 내용은 node.js의 소켓.io 학습 튜토리얼 소개(3)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿