• 9、socket.io,websocket 前后端实时通信,(聊天室的实现)


    websocket 一种通信协议

    ajax/jsonp 单工通信

    websocket 全双工通信 性能高 速度快


    2种方式:

    1、前端的websocket
    2、后端的 socket.io

    demo地址:github

    一、后端socket.io

    https://socket.io/
    安装:

    cnpm i socket.io

    接收on  发送emit ——可以发送任意类型的数据

    后端:

    1、创建httpServer
    2、创建wsServer var ws = io(httpServer);
    3、连接

    ws.on("connect",function(socket){
       		
       		//45  发送或者接收  
       		发送  socket.emit("名称",数据); 
       		广播  socket.broadcast.emit("名称",数据); 
       		接收  socket.on(名称,function(data——数据){
       			
       		      });
       
       });
    

    前端:
    1、引入js src="/socket.io/socket.io.js"
    2、连接
    var ws = io("ws://ip:port");
    3、发送接收 on/emit

    聊天室:

    chat.html

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <style>
    *{padding:0;margin:0;list-style:none;}
    #div1{ position:relative;500px; height:400px; border:1px solid red;}
    #text{ position:absolute;left:0;bottom:0;80%; height:100px;}
    #btn1{ position:absolute;right:0;bottom:0;20%; height:100px;}
    #ul1{100%; height:300px; background:#ccc; overflow-y:auto;}
    #ul1 li{ line-height:30px; border-bottom:1px dashed red;}
    </style>
    <!--<script src="/socket.io/socket.io.js"></script>-->
    <script src="https://cdn.bootcss.com/socket.io/2.1.1/socket.io.js"></script>
    <script>//http://10.30.155.92
    //var ws = io("ws://10.30.155.92:9000");
    //var ws = io("http://10.30.155.92:9000");
    //var ws = io();
    var ws = io.connect("ws://10.30.155.92:9000");//标准写法 ws://
    window.onload = function(){
    	var oUl = document.getElementById("ul1");
    	var oText = document.getElementById("text");
    	var oBtn = document.getElementById("btn1");	
    	
    	
    	var name = prompt("请输入你的用户名")//"张三";
    	oBtn.onclick = function(){
    		//发送数据
    		var data = {name:name,value:oText.value};
    		ws.emit("msg",data);
    		
    		createLi(data);
    	};
    	
    	//接收数据 1创建dom
    	ws.on("msg_all",function(data){
    		console.log(data);
    		createLi(data);
    	});
    	
    	function createLi(data){
    		//创建dom
    		var oLi = document.createElement("li");
    		oLi.innerHTML = `<strong>${data.name}</strong> <span>${data.value}</span>`	;
    		oUl.appendChild(oLi);	
    		oUl.scrollTop = oUl.scrollHeight;
    			
    	}
    };
    </script>
    </head>
    
    <body>
    <div id="div1">
    	<ul id="ul1">
        	<!--<li><strong>张三</strong> <span>聊天内容</span></li>-->
        </ul>
        <textarea id="text"></textarea>
        <input id="btn1" type="button" value="发送"/>
    </div>
    </body>
    </html>
    

    chat.js

    var http = require("http");
    var io = require("socket.io");
    var fs = require("fs");
    
    //创建http服务
    var httpServer = http.createServer(function(req,res){
    	var url = req.url;
    	fs.readFile("www"+url,function(err,data){
    		if(err){
    			res.end("404");
    		} else {
    			res.end(data);	
    		}
    	});
    		
    });
    
    httpServer.listen(9000);
    
    //创建websockt服务
    
    var ws = io(httpServer);
    
    ws.on("connection",function(socket){
    	console.log("wsServer");
    	
    	//接收数据
    	socket.on("msg",function(data){
    		console.log(data);	
    		
    		//发送数据广播
    		socket.broadcast.emit("msg_all",data);
    	});	
    });
    

    前端H5 WebSocket

    ws: http
    wss:https

    前端配置:
    var ws = new WebSocket("ws://ip:port");
    
    ws.onopen = function(evt) { 
      console.log("Connection open ..."); 
      ws.send("Hello WebSockets!");
    };
    
    ws.onmessage = function(evt) {
      console.log( "Received Message: " + evt.data);
      ws.close();
    };
    
    ws.onclose = function(evt) {
      console.log("Connection closed.");
    };
    

    后端:npm i ws

    npm i ws

    https://www.npmjs.com/package/ws

    var wss = new WebSocket({server:httpServer});
    
    wss.on("connection",function(ws,req){
    
    		发送 接收
    		
    		接收
    		ws.onmessage(function(ev){
    			//数据 ev.data
    			
    	  });
    	  
    	  发送:
    	  ws.send(数据);
    	  
    	  数据 最好只能是字符串!!!
    	
    });
    

    exp:

    h5.html
    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <script>
    
    var ws = new WebSocket("ws://localhost:9000");
    
    //建立连接
    ws.onopen = function(ev) { 
      console.log("连接成功"); 
    };
    
    //接收数据
    ws.onmessage = function(ev) {
      console.log( "接收数据",ev.data);//server--->client
      //发送数据
      //ws.send("client--->server");
      try{
    	  //只处理json
    	  var json = JSON.parse(ev.data);
    	  console.log(json);
    	  if(json.type == "click"){
    		  var oSpan = document.getElementById("s1");
    		  oSpan.innerHTML = json.value;
    	  }
      }catch(e){
    	  
      }
    };
    
    //连接关闭
    ws.onclose = function(evt) {
      console.log("连接关闭");
    };     
    
     
    window.onload = function(){
    	var oBtn = document.getElementById("btn1");
    	
    	oBtn.onclick = function(){
    		//发送数据 只能发送字符串 
    		ws.send(JSON.stringify({type:"click",value:"abc"}));
    	};
    	
    }
    
    
    </script>
    </head>
    
    <body>
    
    h5 WebSocket
    <input id="btn1" type="button" value="发送"/><span id="s1">1111</span>
    </body>
    </html>
    
    
    h5.js:
    var http = require("http");
    var WebSocket = require("ws");
    var fs = require("fs");
    
    //创建http服务
    var httpServer = http.createServer(function(req,res){
    	var url = req.url;
    	fs.readFile("www"+url,function(err,data){
    		if(err){
    			res.end("404");
    		} else {
    			res.end(data);	
    		}
    	});
    		
    });
    
    httpServer.listen(9000);
    
    //创建websockt服务
    
    var wss = new WebSocket.Server({ server:httpServer });
     
    wss.on('connection', function connection(ws) {
    	  console.log("wsServer");
    	  //发送 send
    	  ws.send("server--->client");
    	  
    	  //接收
    	  ws.on('message', function(message) {
    		  
    		  console.log(message);
    		  
    		  //ws.send(message);
    		  //广播
    		  wss.clients.forEach(function(client) {
    			if (client.readyState === WebSocket.OPEN) {
    			  client.send(message);
    			}
    		  });
    					  
    		  
    	  }); 
    });
    
    
    
    
    
    
    
    
    
    
    
    爱我所爱无怨无悔
  • 相关阅读:
    C++对象模型
    C/C++内存结构
    第一篇
    Goodbye Steve(19552011)
    DirectX学习笔记_关于Sprite.Draw2D的说明
    Goodbye World!
    js把一个数组的数据平均到几个数组里面
    Django model字段类型清单
    Golang中间件——goredis操作Redis
    Python开发一个短网址生成器
  • 原文地址:https://www.cnblogs.com/zhongchao666/p/9347016.html
Copyright © 2020-2023  润新知