• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
Node.js(3)通信

第一种 使用ws创建WebSokcet服务器

https://github.com/waylau/nodejs-book-samples

安装

npm install ws

  

具备了ws包之后,就可以创建WebSocket服务器了。以下是创建服务器的j简单示例:

const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 8080 });


聊天服务器的需求

聊天服务器的业务需求比较简单,是一个群聊聊天室。换言之,所有人发送的消息大家都可以见到。

当有新用户连接到服务器时,会以该用户的“IP+端口”作为用户的名称。

 

 

 

 

 

 

运行应用

首先启动服务器。执行下面的命令:

 

node sever.js

  

 

 

客户端的实现

客户端是通HTML+JavaScript的方式实现的。由于浏览器原生提供了WebSocket的API,所以并不需要ws框架的支持。

客户端client.html文件代码如下:

 web.html

<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title>WebSocket Chat</title>
</head>

<body>
	<script type="text/javascript">
		var socket;
		if (!window.WebSocket) {
			window.WebSocket = window.MozWebSocket;
		}
		if (window.WebSocket) {
			socket = new WebSocket("ws://localhost:8080/ws");
			socket.onmessage = function (event) {
				var ta = document.getElementById('responseText');
				ta.value = ta.value + '\n' + event.data
			};
			socket.onopen = function (event) {
				var ta = document.getElementById('responseText');
				ta.value = "连接开启!";
			};
			socket.onclose = function (event) {
				var ta = document.getElementById('responseText');
				ta.value = ta.value + "连接被关闭";
			};
		} else {
			alert("你的浏览器不支持 WebSocket!");
		}

		function send(message) {
			if (!window.WebSocket) {
				return;
			}
			if (socket.readyState == WebSocket.OPEN) {
				socket.send(message);
			} else {
				alert("连接没有开启.");
			}
		}
	</script>
	<form onsubmit="return false;">
		<h3>WebSocket 聊天室:</h3>
		<textarea id="responseText" style="width: 500px; height: 300px;"></textarea>
		<br>
		<input type="text" name="message" style="width: 300px" value="Welcome to waylau.com">
		<input type="button" value="发送消息" onclick="send(this.form.message.value)">
		<input type="button" onclick="javascript:document.getElementById('responseText').value=''" 
			value="清空聊天记录">
	</form>
	<br>
	<br>
	<a href="https://waylau.com/">更多例子请访问 waylau.com</a>
</body>

</html>

  

服务器的实现

sever.js

const WebSocket = require('ws');

const server = new WebSocket.Server({ port: 8080 });

server.on('open', function open() {
  console.log('connected');
});

server.on('close', function close() {
  console.log('disconnected');
});

server.on('connection', function connection(ws, req) {
  const ip = req.connection.remoteAddress;
  const port = req.connection.remotePort;
  const clientName = ip + port;

  console.log('%s is connected', clientName)

  // 发送欢迎信息给客户端
  ws.send("Welcome " + clientName);

  ws.on('message', function incoming(message) {
    console.log('received: %s from %s', message, clientName);
    
    // 广播消息给所有客户端
    server.clients.forEach(function each(client) {
      if (client.readyState === WebSocket.OPEN) {
        client.send( clientName + " -> " + message);
      }
    });

  });

});

  

第二种 websocket

安装库

全局安装 -g

npm install nodejs-websocket -g

  

 

 

 

 

 

 sever.js

var ws = require("nodejs-websocket");
console.log("Connecting ...");

var server = ws.createServer(function(conn){

    conn.on("text",function(str){
        //服务端打印接收到的数据
        console.log("News:" + str);
        //接收到的数据打上标记“Server-”,再发送回客户端
        conn.sendText("Server-"+str);
    });

    conn.on("close",function(code,reason) {
        console.log("Disconnected.");
    });

    conn.on("error",function(code,reason) {
        console.log("Error.")
    });
}).listen(8848);

console.log("Server runing!");

  

web.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Game1 Test Demo</title>
</head>

<body>

    <div id="mess">正在连接...</div>
    <div>
        <button id="state1" >第一重</button>
        <button id="state2">第二重</button>
        <button id="state3">第三重</button><br><br>
        <a> 已发送:</a>
        <a id="sendnews"></a><br>
        <a>已接收:</a>
        <a id="receivenews"></a>
    </div>

    <script>
        var mess = document.getElementById("mess");
        if(window.WebSocket){
            //这里修改为本机IP地址
            var ws = new WebSocket('ws://127.0.0.1:8848');

            ws.onopen = function(e){
                console.log("连接服务器成功");
                mess.innerHTML = "连接成功"
                ws.send("TestClient");
            }

            ws.onclose = function(e){
                console.log("服务器关闭");
                mess.innerHTML = "服务器关闭"
            }

            ws.onerror = function(){
                console.log("连接出错");
                mess.innerHTML = "连接出错"
            }

            //收到服务器数据后的回调函数
            ws.onmessage = function(e){
                document.getElementById("receivenews").innerHTML=e.data;
            }

            //设置点击事件
            document.getElementById("state1").onclick = function(e){
                ws.send("昨夜西风凋碧树,独上西楼,望尽天涯路。");
                document.getElementById("sendnews").innerHTML="昨夜西风凋碧树,独上西楼,望尽天涯路。"
            }
            document.getElementById("state2").onclick = function(e){
                ws.send("衣带渐宽终不悔,为伊消得人憔悴。");
                document.getElementById("sendnews").innerHTML="衣带渐宽终不悔,为伊消得人憔悴。"
            }
            document.getElementById("state3").onclick = function(e){
                ws.send("众里寻他千百度,蓦然回首,那人却在灯火阑珊处。");
                document.getElementById("sendnews").innerHTML="众里寻他千百度,蓦然回首,那人却在灯火阑珊处。"
            }
        }
    </script>
</body>

</html>

  

 websocket

posted on 2020-11-01 20:05  MKT-porter  阅读(142)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3