在实现聊天室你必须要用到的文件
通过npm install socket.io
命令获取到socket.io模块
服务器端
www:
var io=require('socket.io').listen(server); global.io=io; //将io提升为全局变量
var ioServer=require('../db/ioServer')(); //将io的connection操作放至该文件下,避免www文件过于臃肿
客户端
头文件引入socket.io.js文件
<script type="text/javascript" src="/lib/socket.io/socket.io.js"></script>
客户端与服务器端实现连接
首先需要知道的API
io.on('connection',function(socket));
监听客户端连接,回调函数会传递本次连接的socket
io.sockets.emit('String',data);
给所有客户端广播消息
io.sockets.socket(socketid).emit('String', data);
给指定的客户端发送消息
socket.on('String',function(data));
监听客户端发送的信息,同样也可以用于客户端监听服务器发送的信息
socket.emit('String', data);
给该socket的客户端发送消息,同样也可以用于向服务器发送消息
客户端如何与服务器端建立连接
var socket=io.connect('http://localhost:3000');
//与localhost:3000发送建立连接的消息
socket.on("open",function() {
socket.emit("addUser",$("#findName").text());
})
//服务器端收到建立连接的消息后,返回一个open信息,标志着服务器与客户端建立连接
//在两者建立连接后,客户端接着发送addUser请求,并将客户端账号的名字作为参数传输过去
服务器端如何响应客户端建立连接的请求
var client={};
//client对象以客户端的用户的名字为标志,存储对应的socket
io.on('connection',function(socket) {
//注:下文中在服务器端中的任何socket方法都是在connection中实现的
socket.emit('open');
//通知客户端已连接
socket.on("addUser",function(username) {
client[username]=socket;
name=username;
//name为该connection方法下标志的socket所对应的客户端的名字,用户离线时会用到
})
//服务器端接收到客户端的addUser请求后,将io.on('connection',function(socket){})返回的socket赋值给对应的client[username]
}
服务器端如何处理客户端断开连接
socket.on('disconnect',function() {
delete client.name;
//当用户离线时,删除client对象中的name属性以及相关的值
})
客户端与服务器端实现一对一即时聊天
客户端所进行的操作
varsend=$(".send-message").children("button");
//发消息按钮
send.on('click',function() {
var message=input.val();
var receiver=$(".onChat").children("span").text();
var poster=$("#findName").text();
var obj={
message:message,
receiver:receiver,
poster:poster
}
//客户端发送的obj对象里面,message表消息,receiver表消息的接收方,poster表消息的发送方,即客户端自己
if(!message)return;
//信息不存在则结束函数
socket.send(obj);
//向服务器端发送obj对象,被服务器端的socket.on('message',function(obj) {}方法接受
input.val('');
})
socket.on('message',function(obj) {
//message方法表示接收到来自他人的消息,或者是自己发送到服务器端的obj的到了服务器的回应(表示发送消息成功),obj则是服务器端原封不动的将信息将上文的obj对象传输给客户端
handleMsg(obj);
//用于在网页更新数据,根据poster与当前客户端的用户名称的关系判断该消息的发送方是否是自己再进行相关操作
//由于网页更新数据不同人有不同方法,略去
}
服务器端进行的操作
socket.on('message',function(obj) {
//这一部分尚未涉及数据库的存储,该内容之后会写
if(client.hasOwnProperty(obj.receiver)){
//如果消息的接收方不在线,则不发送obj
client[obj.receiver].emit('message',obj);
}
socket.emit('message',obj);
//向客户端返回message消息,表示发送成功,虽然暂时未通过数据库实现离线发送,但还是默认消息发送成功:);
}