客戶端使用
引入socket.io客戶端的js
<script src="./js/socket.io-client/dist/socket.io.js"></script>
<script type="text/javascript">
var newssocket=io.connect("http://localhost:3000/newslist") //連接服務(wù)器下的某個(gè)命名空間
//向服務(wù)器發(fā)送news事件
newssocket.emit("news","name",function(data){ //發(fā)送數(shù)據(jù)時(shí),需要回調(diào)函數(shù)(當(dāng)異步獲取數(shù)據(jù)事)
console.log(data)
newssocket.emit("newlist",{my:"data"}) //向服務(wù)器發(fā)送數(shù)據(jù)
})
//監(jiān)聽服務(wù)器端hi事件
newssocket.on("hi",function(data){
console.log(data)
})
</script>
服務(wù)器使用
var app = require('express')();
var News=require("../routes/news")
var http = require('http');
var socketIo=require("socket.io");
app.set("port",3000)
var server=http.createServer(app)
var io=socketIo.listen(server); //監(jiān)聽服務(wù)器端口
io.of("/newslist").on("connection",function(socket){ //
new News(socket,io)
socket.on("disconnect",function(){
io.emit("user disconneted")
})
})
class News{
constructor(socket,io){
this.socket=socket;
this.io=io;
this.onmonitorNewList();
this.onRecieveClient();
}
/**
* 監(jiān)聽客戶端信息
*/
onRecieveClient(){
var that=this;
this.socket.on("newlist",function(data){
console.log(data)
})
this.socket.on("news",function(name,fn){ //
console.log(name)
that.getNewList(fn)
})
}
/**
*
* @param {客戶端回調(diào)函數(shù)} fn
*/
getNewList(fn){
var data={
name:"張三",
value:""
}
fn(data)
}
}
module.exports=News
socket.io使用方式總結(jié)
一 on 和emit事件
on 監(jiān)聽事件
emit 發(fā)送事件
var io=require("socket.io").listen(80)
io.on("connnetion",function(socket){
socket.on("news",function(data){ //監(jiān)聽服務(wù)器端的news事件
console.log(data)
socket.emit("hello","張三") //向服務(wù)器發(fā)送hello事件 值為張三
})
})
var io=require("socket.io").listen(80)
io.on("connnetion",function(socket){
socket.on("hello",function(data){ //監(jiān)聽客戶端發(fā)送的hello事件
console.log(data) //data值為張三
socket.emit("news","newlist")
})
})
二 發(fā)送和獲取數(shù)據(jù)(回調(diào)函數(shù))
監(jiān)聽事件(發(fā)送數(shù)據(jù))--服務(wù)器端
var io=require("socket.io").listen(80)
io.on("connnetion",function(socket){
socket.on("news",function(name,fn){ //第一個(gè)為參數(shù) 第二個(gè)位獲取數(shù)據(jù)后的回調(diào)函數(shù)
fn("newlist")
})
})
發(fā)送函數(shù)事件(獲取數(shù)據(jù))---客戶端
socket.emit("news","params",function(data){
console.log(data) //data的值為newlist
})
三 限制命名空間
如果您可以控制為特定應(yīng)用程序發(fā)出的所有消息和事件,則使用默認(rèn)/命名空間。 如果您想利用第三方代碼或生成與其他人共享的代碼,socket.io提供了一種命名空間套接字的方法。
這具有多路復(fù)用單個(gè)連接的優(yōu)點(diǎn)。 而不是使用兩個(gè)WebSocket連接的socket.io,它將使用一個(gè)。
客戶端
<script>
var chat = io.connect('http://localhost/chat')
, news = io.connect('http://localhost/news');
chat.on('connect', function () {
chat.emit('hi!');
});
news.on('news', function () {
news.emit('woot');
});
</script>
服務(wù)器端
var io = require('socket.io')(80);
var chat = io
.of('/chat')
.on('connection', function (socket) {
socket.emit('a message', {
that: 'only'
, '/chat': 'will get'
});
chat.emit('a message', {
everyone: 'in'
, '/chat': 'will get'
});
});
var news = io
.of('/news')
.on('connection', function (socket) {
socket.emit('item', { news: 'item' });
});
四: 發(fā)送廣播
要進(jìn)行廣播,只需添加廣播標(biāo)志即可發(fā)出和發(fā)送方法調(diào)用。 廣播意味著向除了啟動(dòng)它的套接字之外的所有人發(fā)送消息。
var io = require('socket.io')(80);
io.on('connection', function (socket) {
socket.broadcast.emit('user connected');
});
五Socket.io 的發(fā)送對(duì)象范圍
1 向當(dāng)前客戶端發(fā)送事件
socket.emit('login', { numUsers: numUsers });
2 廣播(不包含當(dāng)前客戶端)
socket.broadcast.emit('new message', { username: socket.username, message: data});
3 廣播(且包含當(dāng)前客戶端)
io.sockets.emit('message', "this is a test");
4 在房間廣播(不包含當(dāng)前客戶端)
socket.broadcast.to('game').emit('message', 'nice game');
5 在房間廣播(包含當(dāng)前客戶端)
io.sockets.in('game').emit('message', 'cool game');
6 發(fā)送給指定客戶端
io.sockets.sockets[socketid].emit('message', 'for your eyes only');