doubleyong
管理员
管理员
  • 最后登录2025-10-18
  • 发帖数1198
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
阅读:11558回复:2

websocket + nodejs 的express框架 做个简单的网页聊天室

楼主#
更多 发布于:2016-06-27 15:33

描述:websocket与服务端的原理图

图片:websocket原理图.png

websocket与服务端的原理图

websocket 与 服务器之间的原理图

客户端: 通过websocket来发送请求,及接收请求, 在客户端的JS中,可以添加如下代码:
               代码说明:在页面加载时,就执行下面的代码。首先是创建一个websocket,即与指定的地址,创建一个通道.  然后,给此通道添加对应的事件。打开时,监听到消息时,关闭时对应的处理。

var  socket = new WebSocket('ws://172.16.7.26:8888/');
     // 打开Socket
     socket.onopen = function(event) {
         console.log("socket 已经打开");
         // 发送消息到服务器, 此方法在socket在此方法外面也可以使用
         socket.send('I am the client and I\'m listening!');
         // 监听服务器返回的消息
          socket.onmessage = function(event) {
              console.log('Client received a message',event);
              console.log(event.data); //得到服务器返回的消息数据
          };
  
          // 监听Socket的关闭
          socket.onclose = function(event) {
              console.log('Client notified socket has closed',event);
          };
  
          // 关闭Socket....
          //socket.close()
      };
服务器:
        说明:          第一部分是使用express框架,搭建服务器。
         第二部分是关于服务器的socket, 因为,采用的是ws协议,所以,引用的是ws模块。
                   然后,创建一个ws地址。 在这其添加在对应的事件处理。  
var express =  require("./server/node_modules/express");  //引入express框架资源
var ws = require('./server/node_modules/ws').Server;  //注意这里,客户端用的是ws://172.16.7.26:8888/ 这里用的是WS协议,所有我们加载的是ws框架
  
var app = express(); //执行express的全局函数,返回一个express的对象
app.set("port",9999); //键/值对的方式
  
//express 进行配置
app.configure(function(){
        app.use(express.logger("dev")); //日志模块,主要是开发者使用的
        //使用post 接收数据的两个配置
        app.use(express.bodyParser()); //使用了bodyParser模块,把参数的数据封装在requestbody里面
        app.use(express.methodOverride()); //非get请求的转换
        app.use(app.router); //设置路由,分发
        // __dirname:这是一个全局变量,返回就是当前文件的一个目录
        app.use(express.static(__dirname+"/client"));//静态资源文件的路径
    }
);
app.get('/', function(req, res){
    res.redirect("socket.html");
});
  
app.listen(app.get("port"),function(req,resp){
    console.log("请求来了");
});
  
//------------------------下面是关于socket服务端相关内容-------------------------------
 
var cons = new Array(); //数组,用户存储与客户的连接
var server = new ws({host:"172.16.7.26",port:8888}); //创建一个ws的地址,注意,这个地址就是客户端请求的socket服务端的地址
//给服务的连接事件,添加对应的方法 
server.on('connection',function(ws){
    console.log('new connection founded successfully');
    cons.push(ws); // 每当建立一个连接成功后,就将这个连接加入到数组中
    ws.on('message',function(data){ //得到客户端发送的消息的事件处理
        for(var i=0;i<cons.length;i++){
            cons[i].send(data); //将得到的数据,发送到每一个客户端
            console.log("接收到数据:"+data);
        }
    });
    ws.on('close',function(){ //当关闭一个连接时的处理
        for(var i=0;i<cons.length;i++){
            if(cons[i] == ws) cons.splice(i,1);
        }
    });
});
DEMO原码:
      客户端:
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<style type="text/css">
  
    #CharMessage{
        color: white;
        border: 1px solid black;
        height: 500px;
        width: 300px;
        overflow-y: scroll;
        background: url(img/1.png);
    }
</style>
<body>
<div id="login">
    <p>登 录</p>
    <p><input type="text" name="txtName" id="txtName" placeholder="请输入用户名"/></p>
    <button onclick="funlogin()">登录</button>
</div>
<div id="chart" style="display: none;">
<div id="CharMessage"></div>
    <p></p>
<input type="text" name="txtMessage" id="txtMessage" placeholder="请输入发送的消息"/>
  
    <button onclick="sendMessage()">发送</button>
    <button onclick="logout()">注销</button>
    <p>当前在线人数:<span id="spanNum"></span></p>
</p>
</div>
<script type="text/javascript">
    var socket;
    var dMessage;
    var username;
    var login = document.getElementById("login");
    var chart = document.getElementById("chart");
    var spanNum = document.getElementById("spanNum");
   window.onload = function(){
       dMessage = document.getElementById("CharMessage");
       socket = new WebSocket('ws://172.16.7.26:8888/');
  
       // 打开Socket
       socket.onopen = function(event) {
           console.log("socket 已经打开");
           // 发送一个初始化消息
//           socket.send('I am the client and I\'m listening!');
  
           // 监听消息
           socket.onmessage = function(event) {
               console.log('Client received a message',event);
               var jsonobj = JSON.parse(event.data);
               dMessage.innerHTML="<p> <b>"+jsonobj.name+"说:</b>  "+jsonobj.message+"</br><div style='text-align: right'>"+(new Date()).toLocaleTimeString()+"  </div></p>"+ dMessage.innerHTML; // 加载服务器发送过来的留言
               spanNum.innerHTML=jsonobj.online+" 人";
           };
  
           // 监听Socket的关闭
           socket.onclose = function(event) {
               console.log('Client notified socket has closed',event);
           };
  
           // 关闭Socket....
           //socket.close()
       };
       checkLogin();
   }
    //判断是否登录
    function checkLogin(){
        if(localStorage.getItem("username")==null||localStorage.getItem("username")==undefined){
            login.style.display="block";
            chart.style.display="none";
  
        }else{
            login.style.display="none";
            chart.style.display="block";
  
            username =localStorage.getItem("username");
        }
    }
   function sendMessage(){
  
       var message = document.getElementById("txtMessage").value;
       var jsonobj = {name:username,message:message,online:""};
       socket.send(JSON.stringify(jsonobj)); //发送信息到服务器
       document.getElementById("txtMessage").value="";
   }
    function socketClose(){
        socket.close();
  
    }
    function funlogin(){
        var name = document.getElementById("txtName").value;
        localStorage.setItem("username",name);
        checkLogin();
    }
    function logout(){
        localStorage.removeItem("username");
        checkLogin();
    }
</script>
</body>
</html>
服务器:
 
var express =  require("./server/node_modules/express");  //引入express框架资源
var ws = require('./server/node_modules/ws').Server;
  
var app = express(); //执行express的全局函数,返回一个express的对象
app.set("port",9999); //键/值对的方式
  
//express 进行配置
app.configure(function(){
        app.use(express.logger("dev")); //日志模块,主要是开发者使用的
        //使用post 接收数据的两个配置
        app.use(express.bodyParser()); //使用了bodyParser模块,把参数的数据封装在requestbody里面
        app.use(express.methodOverride()); //非get请求的转换
        app.use(app.router); //设置路由,分发
        // __dirname:这是一个全局变量,返回就是当前文件的一个目录
        app.use(express.static(__dirname+"/client"));//静态资源文件的路径
  
  
    }
);
app.get('/', function(req, res){
    res.redirect("socket.html");
});
  
app.listen(app.get("port"),function(req,resp){
    console.log("请求来了");
});
  
  
var cons = new Array();
var server = new ws({host:"172.16.7.26",port:8888});
server.on('connection',function(ws){
    console.log('new connection founded successfully');
    cons.push(ws);
    ws.on('message',function(data){
        var jsonobj = JSON.parse(data);
        jsonobj.online = cons.length;
        data = JSON.stringify(jsonobj);
        for(var i=0;i<cons.length;i++){
            cons[i].send(data);
            console.log("接收到数据:"+data);
        }
    });
    ws.on('close',function(){
        for(var i=0;i<cons.length;i++){
            if(cons[i] == ws) cons.splice(i,1);
        }
    });
});
知识需要管理,知识需要分享
风923
贫民
贫民
  • 最后登录2017-02-26
  • 发帖数1
沙发#
发布于:2017-02-16 16:22
厉害了,参考参考
oliver
VIP
VIP
  • 最后登录2017-08-15
  • 发帖数4
板凳#
发布于:2016-08-17 09:44
理论 + 实践,通俗易懂;
websocket protocol 是H5中的新协议,用在聊天室的文本、图片等媒体传输too easy,坐等其火。
游客


返回顶部

公众号

公众号