视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
怎样用nodejs搭建服务器
2020-11-27 19:59:30 责编:小采
文档
这次给大家带来怎样用nodejs搭建服务器,用nodejs搭建服务器的注意事项有哪些,下面就是实战案例,一起来看一下。

Gxl网相关教程推荐:Node.js视频教程

简单开始

1.安装node。https://nodejs.org/en/

2.安装ws模块

ws:是nodejs的一个WebSocket库,可以用来创建服务。 https://github.com/websockets/ws

3.server.js

在项目里面新建一个server.js,创建服务,指定8181端口,将收到的消息log出来。

var WebSocketServer = require('ws').Server,
wss = new WebSocketServer({ port: 8181 });
wss.on('connection', function (ws) {
 console.log('client connected');
 ws.on('message', function (message) {
 console.log(message);
 });
});

4.建立一个client.html。

在页面上建立一个WebSocket的连接。用send方法发送消息。

 var ws = new WebSocket("ws://localhost:8181");
 ws.onopen = function (e) {
 console.log('Connection to server opened');
 } function sendMessage() {
 ws.send($('#message').val());
 }

页面:

<html xmlns="http://www.w3.org/1999/xhtml"><head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>WebSocket Echo Demo</title>
 <meta name="viewport" content="width=device-width, initial-scale=1"/>
 <link href="../bootstrap-3.3.5/css/bootstrap.min.css" rel="stylesheet" />
 <script src="../js/jquery-1.12.3.min.js"></script>
 <script src="../js/jquery-1.12.3.min.js"></script>
 <script src="../bootstrap-3.3.5/js/bootstrap.min.js"></script>
 <script>
 var ws = new WebSocket("ws://localhost:8181");
 ws.onopen = function (e) {
 console.log('Connection to server opened');
 } function sendMessage() {
 ws.send($('#message').val());
 } </script></head><body >
 <p class="vertical-center">
 <p class="container">
 <p> </p>
 <form role="form" id="chat_form" onsubmit="sendMessage(); return false;">
 <p class="form-group">
 <input class="form-control" type="text" name="message" id="message"
 placeholder="Type text to echo in here" value="" />
 </p>
 <button type="button" id="send" class="btn btn-primary"
 onclick="sendMessage();">
 Send! </button>
 </form>
 </p>
 </p></body></html>

View Code

运行之后如下,服务端即时获得客户端的消息。

模拟股票

上面的例子很简单,只是为了演示如何运用nodejs的ws创建一个WebSocket服务器。且可以接受客户端的消息。那么下面这个例子演示股票的实时更新。客服端只需要连接一次,服务器端会不断地发送新数据,客户端收数据后更新UI.页面如下,有五只股票,开始和停止按钮测试连接和关闭。

服务端:

1.模拟五只股票的涨跌。

var stocks = { "AAPL": 95.0, "MSFT": 50.0, "AMZN": 300.0, "GOOG": 550.0, "YHOO": 35.0}function randomInterval(min, max) { return Math.floor(Math.random() * (max - min + 1) + min);
}var stockUpdater;var randomStockUpdater = function() { for (var symbol in stocks) { if(stocks.hasOwnProperty(symbol)) { var randomizedChange = randomInterval(-150, 150); var floatChange = randomizedChange / 100;
 stocks[symbol] += floatChange;
 }
 } var randomMSTime = randomInterval(500, 2500);
 stockUpdater = setTimeout(function() {
 randomStockUpdater();
 }, randomMSTime);
}
randomStockUpdater();

2.连接建立之后就开始更新数据

wss.on('connection', function (ws) { var sendStockUpdates = function (ws) { if (ws.readyState == 1) { var stocksObj = {}; for (var i = 0; i < clientStocks.length; i++) { var symbol = clientStocks[i];
 stocksObj[symbol] = stocks[symbol];
 } if (stocksObj.length !== 0) { ws.send(JSON.stringify(stocksObj));//需要将对象转成字符串。WebSocket只支持文本和二进制数据
 console.log("更新", JSON.stringify(stocksObj));
 }
 
 }
 } var clientStockUpdater = setInterval(function () {
 sendStockUpdates(ws);
 }, 1000);
 ws.on('message', function (message) { var stockRequest = JSON.parse(message);//根据请求过来的数据来更新。
 console.log("收到消息", stockRequest);
 clientStocks = stockRequest['stocks'];
 sendStockUpdates(ws);
 });

客户端:

建立连接:

 var ws = new WebSocket("ws://localhost:8181");

onopen直接只有在连接成功后才会触发,在这个时候将客户端需要请求的股票发送给服务端。

var isClose = false; var stocks = { "AAPL": 0, "MSFT": 0, "AMZN": 0, "GOOG": 0, "YHOO": 0
 }; function updataUI() {
 ws.onopen = function (e) {
 console.log('Connection to server opened');
 isClose = false; ws.send(JSON.stringify(stock_request));
 console.log("sened a mesg");
 } //更新UI
 var changeStockEntry = function (symbol, originalValue, newValue) { var valElem = $('#' + symbol + ' span');
 valElem.html(newValue.toFixed(2)); if (newValue < originalValue) {
 valElem.addClass('label-danger');
 valElem.removeClass('label-success');
 } else if (newValue > originalValue) {
 valElem.addClass('label-success');
 valElem.removeClass('label-danger');
 }
 } // 处理受到的消息
 ws.onmessage = function (e) { var stocksData = JSON.parse(e.data);
 console.log(stocksData); for (var symbol in stocksData) { if (stocksData.hasOwnProperty(symbol)) {
 changeStockEntry(symbol, stocks[symbol], stocksData[symbol]);
 stocks[symbol] = stocksData[symbol];
 }
 }
 };
 }
 updataUI();

运行效果如下:只需要请求一次,数据就会不断的更新,效果是不是很赞,不用轮询,也不用长连接那么麻烦了。文章末尾会附上所有源码。

(美股的涨跌和A股的颜色是反的,即红跌绿涨)

实时聊天

上面的例子是连接建立之后,服务端不断给客户端发送数据。接下来例子是一个简单的聊天室类的例子。可以建立多个连接。

1.安装node-uuid模块,用来给每个连接一个唯一号。

2.服务端消息发送

消息类型分notification和message两种,前者是提示信息,后者是聊天内容。消息还包含一个id、昵称和消息内容。在上一节有学习到readyState有四个值,OPEN表示连接建立可以发送消息。如果页面关闭了,为WebSocket.CLOSE。

function wsSend(type, client_uuid, nickname, message) { for (var i = 0; i < clients.length; i++) { var clientSocket = clients[i].ws; if (clientSocket.readyState === WebSocket.OPEN) {
 clientSocket.send(JSON.stringify({ "type": type, "id": client_uuid, "nickname": nickname, "message": message
 }));
 }
 }
}

3.服务端处理连接

每新增加一个连接,都会发送一条匿名用户的加入的提示消息,如果消息中带有“/nick” 认为这一个修改昵称的消息。然后更新客户端的昵称。其他都会当做聊天消息处理。

wss.on('connection', function(ws) { var client_uuid = uuid.v4(); var nickname = "AnonymousUser" + clientIndex;
 clientIndex += 1;
 clients.push({ "id": client_uuid, "ws": ws, "nickname": nickname });
 console.log('client [%s] connected', client_uuid); var connect_message = nickname + " has connected"; wsSend("notification", client_uuid, nickname, connect_message);
 console.log('client [%s] connected', client_uuid);
 ws.on('message', function(message) { if (message.indexOf('/nick') === 0) { var nickname_array = message.split(' '); if (nickname_array.length >= 2) { var old_nickname = nickname;
 nickname = nickname_array[1]; var nickname_message = "Client " + old_nickname + " changed to " + nickname; wsSend("nick_update", client_uuid, nickname, nickname_message);
 }
 } else {
 wsSend("message", client_uuid, nickname, message);
 }
 });

处理连接关闭:

 var closeSocket = function(customMessage) { for (var i = 0; i < clients.length; i++) { if (clients[i].id == client_uuid) { var disconnect_message; if (customMessage) {
 disconnect_message = customMessage;
 } else {
 disconnect_message = nickname + " has disconnected";
 } wsSend("notification", client_uuid, nickname, disconnect_message);
 clients.splice(i, 1);
 }
 }
 };
 ws.on('close', function () {
 closeSocket();
 });

4.客户端

没有启动时,页面如下,change按钮用来修改昵称。

<p class="vertical-center">
 <p class="container">
 <ul id="messages" class="list-unstyled"></ul>
 <hr/>
 <form role="form" id="chat_form" onsubmit="sendMessage(); return false;">
 <p class="form-group">
 <input class="form-control" type="text" id="message" name="message"
 placeholder="Type text to echo in here" value="" autofocus/>
 </p>
 <button type="button" id="send" class="btn btn-primary"
 onclick="sendMessage();">
 Send Message </button>
 </form>
 <p class="form-group"><span>nikename:</span><input id="name" type="text" /> <button class="btn btn-sm btn-info" onclick="changName();">change</button></p>
 </p>
 </p>

View Code

js:

 
 ws = WebSocket("ws://localhost:8181" nickname = ""= 'Connection to server opened'
 ( message == "undefined") messages = document.getElementById('messages' messageElem = document.createElement("li" (type === 'notification'= "<span class=\"label label-info\">*</span>" (type == 'nick_update'= "<span class=\"label label-warning\">*</span>"= "<span class=\"label label-success\">"
 + nickname + "</span>" message_text = "<h2>" + preface_label + "  "
 + message + "</h2>"=
 ws.onmessage = data =="ID: [%s] = %s"= "Connection closed""Connection closed"
 messageField = document.getElementById('message' (ws.readyState ==== ''
 name = $("#name" (ws.readyState ==="/nick " +

运行结果:

页面关闭之后,连接马上断开。

这种实时响应的体验简直不能太爽,代码也清爽了,前端体验也更好,客户端不用一直发请求,服务端不用等着被轮询。

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

JavaScript的var与this,{}与function

怎样将Node.JS部署到Heroku

下载本文
显示全文
专题