摘要:用來接受房間給此命名有一個新連接創(chuàng)建成功然后瀏覽器控制臺鏈接成功之后,輸入為了更好地測試效果,可以開啟兩個控制臺,一個控制臺發(fā)送消息,另外一個控制臺會跳出消息,相當(dāng)于聊天的推送。
之前一直在講理論玩,這次說點干貨吧。
順帶說一下,那個從零單排vue系列,過些日子再寫吧。尤神終究是尤神,一時半會兒也確實難以把vue整個模擬出來。
繼續(xù)說正題。(這里需要一個node環(huán)境,電腦上
如果沒有裝node的話...查一下怎么裝,
如果不知道怎么安裝依賴包的話,也查一下,
如果不知道怎么運行js文件的話,也查一下)
我這里就直接使用 一個 名為 nodejs-webscoket 的工具包
1、首先創(chuàng)建一個websocket 服務(wù),這里占用一下3000端口:
const ws = require("nodejs-websocket"); const wsServer = ws.createServer(function(res) { console.log("有一個新連接"); setTimeout(function(){res.sendText("hello")}, 1000); }) wsServer.listen(3000, function(err){if(!err) console.log("創(chuàng)建成功");}); 然后啟動服務(wù),啟動服務(wù)之前記得先 npm install nodejs-websocket --save 不然會報錯缺失依賴包
這時候可以在 瀏覽器的 console 控制臺 輸入
var connect1 = new WebSocket("ws://localhost: 3000"); var connect2 = new WebSocket("ws://localhost: 3000");
看到node的控制臺打印了三行話
創(chuàng)建成功, 有一個新連接,有一個新連接
這里就是創(chuàng)建成功了ws服務(wù)了。
2、然后就是前后端的交互。
剛剛的后臺有一句
setTimeout(function(){res.sendText("hello")}, 1000);
這是后臺給前端傳的一個內(nèi)容,但是因為前端并沒有寫接受方法,
所以 可以重新寫一個connect3 測一測 前后端交互。
var connect3 = new WebSocket("ws://localhost: 3000"); connect3.onmessage = function(res) { console.log(res); }
如果寫得沒問題的話,一秒鐘之后,瀏覽器控制臺出來了一條消息。
剛剛說了后臺給前端傳消息了,再說下前端給后臺傳消息;
前端給后臺傳消息的方法叫做 send;
nodejs-websocket 的接受方法叫 on("text")
這里重寫一下 后臺,給后臺加點功能。
const ws = require("nodejs-websocket"); const wsServer = ws.createServer(function(res) { console.log("有一個新連接"); res.on("text", function(text) { console.log(text); res.sendText("我收到你的消息" + text) }) }) wsServer.listen(3000, function(err){if(!err) console.log("創(chuàng)建成功");});
然后重啟ws服務(wù)器...就是重新運行一下這個js
前端瀏覽器控制臺 也重寫一下按回車(剛剛后臺重啟了,這樣相當(dāng)于重新調(diào)一下接口)
var connect = new WebSocket("ws://localhost: 3000"); connect.onmessage = function(res) { console.log(res); }
連接成功之后
瀏覽器控制臺輸入一句
connect.send("1234556")
這時候就看到后臺給這邊返回了一條消息....這樣基本的長連接功能就完成了。
然后就是給每個連接取一個自己的名字。
前端這邊,每個連接都有名字,比如 connect, connect1, connect2。但是后臺并沒有明確的區(qū)分點。
所以這里前端鏈接websocket 的時候,將 信息帶進去,后臺增加一個 url 包,解析url,這里就不弄多少房間了,就一個chatRoom 房間, 并且固定一下參數(shù)為name。(懶得寫判斷)
重寫一下后臺
const ws = require("nodejs-websocket"); const url = require("url"); const wsRooms = {chatRoom:{}};// 用來接受房間 const wsServer = ws.createServer(function(conn) { var urlInfo = url.parse(conn.path, true); wsRooms.chatRoom[urlInfo.query.name] = conn; // 給此 res 命名 console.log("有一個新連接"); console.log(wsRooms); }) wsServer.listen(3000, function(err){if(!err) console.log("創(chuàng)建成功");});
這個時候前端瀏覽器輸入
var connect = new WebSocket("ws://localhost:3000/chatRoom?name=hello"); connect.onmessage = function(res) { console.log(res); }
后臺的wsRooms已經(jīng)將這個 對話連接 加入到 其 chatRoom 下面去了。并且取名為hello
然后就到了最后一步了,聊天
剛剛 有實驗是 前端send 后臺就給返回一個 "我收到了你的消息"
現(xiàn)在要變成 前端 send, 后臺 找被 send 的人,然后給那個那個人發(fā)送,send 的消息
因為上面已經(jīng)給 每一個對話都命名了,所以send一個 user,再send 一個 text ,后端解析后給這個user發(fā)送內(nèi)就行。 我就直接上代碼了。
const ws = require("nodejs-websocket"); const url = require("url"); const wsRooms = {chatRoom:{}};// 用來接受房間 const wsServer = ws.createServer(function(res) { var urlInfo = url.parse(res.path, true); wsRooms.chatRoom[urlInfo.query.name] = res; // 給此 res 命名 console.log("有一個新連接"); console.log(wsRooms); res.on("text", function(res) { var data = JSON.parse(res); var sender = data.name; var text = data.text; var message = {name: urlInfo.query.name, text: text}; wsRooms.chatRoom[sender].sendText(JSON.stringify(message)); }) }) wsServer.listen(3000, function(err){if(!err) console.log("創(chuàng)建成功");});
然后瀏覽器控制臺
var hello = new WebSocket("ws://localhost:3000/chatRoom?name=hello"); hello.onmessage = function(res) { console.log(res); } var lolo = new WebSocket("ws://localhost:3000/chatRoom?name=lolo"); lolo.onmessage = function(res) { console.log(res); } 鏈接成功之后,輸入 hello.send(JSON.stringify({name:"lolo", text: "hello lolo"}));
為了更好地測試效果,可以開啟兩個控制臺,一個控制臺發(fā)送消息,另外一個控制臺會跳出消息,相當(dāng)于聊天的推送。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/105841.html
摘要:前端邏輯搞定之后,思考一下這個聊天室的交互是怎么實現(xiàn)的。在前端監(jiān)聽一個事件,這個事件的觸發(fā)條件是成功和服務(wù)端建立連接。攜帶一個參數(shù),即用戶的輸入。別人發(fā)送的消息現(xiàn)在就需要在前端建立一個響應(yīng)服務(wù)端有新消息的監(jiān)聽事件了。 一些廢話:) 最近在學(xué)校比較閑,終于有這么一塊時間可以自由支配了,所以內(nèi)心還是十分的酸爽舒暢的。當(dāng)然了,罪惡的事情也是有的,比如已經(jīng)連續(xù)一周沒有吃早飯了,其實現(xiàn)在回頭想想...
摘要:前端邏輯搞定之后,思考一下這個聊天室的交互是怎么實現(xiàn)的。在前端監(jiān)聽一個事件,這個事件的觸發(fā)條件是成功和服務(wù)端建立連接。攜帶一個參數(shù),即用戶的輸入。別人發(fā)送的消息現(xiàn)在就需要在前端建立一個響應(yīng)服務(wù)端有新消息的監(jiān)聽事件了。 一些廢話:) 最近在學(xué)校比較閑,終于有這么一塊時間可以自由支配了,所以內(nèi)心還是十分的酸爽舒暢的。當(dāng)然了,罪惡的事情也是有的,比如已經(jīng)連續(xù)一周沒有吃早飯了,其實現(xiàn)在回頭想想...
摘要:好的,這樣以來我們的前期準(zhǔn)備工作就已經(jīng)完成了,下面我們來搭建聊天室對應(yīng)的客戶端和服務(wù)器端。 websocket簡介 websocket其實HTML中新增加的內(nèi)容,其本質(zhì)還是一種網(wǎng)絡(luò)通信協(xié)議,以下是websocket的一些特點: (1)因為連接在端口80(ws)或者443(wss)上創(chuàng)建,與HTTP使用的端口相同,幾乎所有的防火墻都不會阻塞WebSocket鏈接 (2)因...
摘要:好的,這樣以來我們的前期準(zhǔn)備工作就已經(jīng)完成了,下面我們來搭建聊天室對應(yīng)的客戶端和服務(wù)器端。 websocket簡介 websocket其實HTML中新增加的內(nèi)容,其本質(zhì)還是一種網(wǎng)絡(luò)通信協(xié)議,以下是websocket的一些特點: (1)因為連接在端口80(ws)或者443(wss)上創(chuàng)建,與HTTP使用的端口相同,幾乎所有的防火墻都不會阻塞WebSocket鏈接 (2)因...
摘要:發(fā)布本周正式發(fā)布,包含了一系列的特性提升與問題修復(fù),同時也在不斷致力于將打造地更為輕巧與高性能。當(dāng)然,姜振勇老師還會介紹的多種服務(wù),包括大數(shù)據(jù)網(wǎng)絡(luò)和安全,展現(xiàn)彈性安全和高可擴展性的全方位能力。 showImg(http://upload-images.jianshu.io/upload_images/1647496-2ce7598e6987d9af.jpg?imageMogr2/aut...
閱讀 1955·2021-11-23 09:51
閱讀 1604·2021-11-19 09:40
閱讀 3266·2021-11-11 11:01
閱讀 1216·2021-09-27 13:34
閱讀 1910·2021-09-22 15:56
閱讀 2192·2019-08-30 15:52
閱讀 1130·2019-08-30 14:13
閱讀 3540·2019-08-30 14:10