使用Node+websocket实现简易1v1聊天室(前端+服务器)
前提:
安装好node环境~~~ 可使用 node -v 和 npm -v 查看是否装好
实现逻辑:
用户A 用户B 服务器
用户A->进入聊天室(和服务器建立连接)->向服务器发送数据(两种情况:一.只有用户A在聊天室,那服务器只向用户A返回聊天内容 二.用户B也在聊天室,服务器需要对用户A和用户B同时返回聊天内容) ->返回的聊天内容 用户A对内容进行判断,若为用户A发送的消息,渲染在页面右边,若为用户B发送消息,渲染在页面左边
用户B 同理
1.新建一文件夹,在该目录下的命令行 输入 npm init 初始化项目
2.在该目录下的命令行输入 npm install nodejs-websocket 安装websocket
3.在该目录下新建个js文件(例:websocket.js) ,然后将 下面的node代码复制进去
4.新建两个html文件, 分别将两个页面的代码复制进去
5.在该目录下的命令行输入 node + 你的js文件名 (node websocket.js) 然后回车执行
6.接着打开两个html文件,即可开始聊天
em~~功能不够完善,如果刷新了页面,你可以 两次 ctrl+c
结束项目 重新启动
安装websocket
//npm install nodejs-websocket
node代码
// websocket.js
var ws = require("nodejs-websocket");
console.log("开始建立连接...")
//sendText只能发送字符串 所以对要发送的数据进行处理
function sendToOne(origin,text,type){
return JSON.stringify({
uid:origin,
text,
type
})
}
//首先 websocket的connect是单向发送,即从哪来的请求发送回哪去
//所以会有userOne和userTwo来替代connect分别向user1和user2发送消息
//sendResult 抽取了公共代码 user1和user2第一次进入服务器时所需要进行和只有一方在服务器时所需要进行的操作 (当只有一方在服务器时的代码需要完善)
function sendResult(obj,connect){
return obj.type==='test'?connect.sendText(sendToOne(obj.uid,obj.userName+'连接成功',obj.type)):connect.sendText(sendToOne(obj.uid,obj.text,obj.type));
}
var userOne = null,userTwo = null,user1Ready = false , user2Ready = false;
var server = ws.createServer(function(connect){
connect.on("text", function (strObj) {
var req = JSON.parse(strObj)
//当双方都在服务器上时 即可正常聊天
if(user1Ready&&user2Ready){
userOne.sendText(strObj);
userTwo.sendText(strObj);
}
else if(req.userName=='user1'){
userOne = connect;
user1Ready = true;
sendResult(req,userOne)
}else if(req.userName=='user2'){
userTwo = connect;
user2Ready = true;
sendResult(req,userTwo)
}
if(!(user1Ready||user2Ready)){
console.log(user1Ready,user2Ready)
connect.sendText('连接失败')
}
})
connect.on("close", function (code, reason) {
console.log("code:",code)
console.log("reason:",reason)
console.log(