链接过程

前端

1、CREATED WEBSOCKE

2、ONOPEN

3、ONMESSAGE

服务端

1、收到request

2、给客户端发送消息,生成id

//msg
{
type: "id",
id: Date.now()
}

前端

1、收到messge,type为id,

2、给服务端发送消息type=username的消息,携带id

// clientID = msg.id
var msg = {
name: document.getElementById("name").value,
date: Date.now(),
id: clientID,
type: "username"
};

服务端

1、收到type为username的msg

2、设置connect.username = msg.name;

3、广播给其他用户消息 type: "userlist",


var userListMsg = {
type: "userlist",
users: []
};

4、服务端发送usename消息

if (sendToClients) {
var msgString = JSON.stringify(msg);
var i; for (i=0; i<connectionArray.length; i++) {
console.log(102, msgString); connectionArray[i].sendUTF(msgString);
}
}

前端

1、 前端收到type=userlist的message,渲染用户列表 2、 前端收到type=username的message,渲染聊天室的登录消息

User lili signed in at 上午10:03:24
User hanmei signed in at 上午10:03:24
/**
* @Description: In User Settings Edit
* @Author: your name
* @Date: 2019-09-02 16:17:14
* @LastEditTime: 2019-09-04 10:16:54
* @LastEditors: Please set LastEditors
*/ "use strict"; var https = require('http');
// var fs = require('fs');
var WebSocketServer = require('websocket').server; var connectionArray = [];
var nextID = Date.now();
var appendToMakeUnique = 1; // var httpsOptions = {
// key: fs.readFileSync("/etc/pki/tls/private/mdn-samples.mozilla.org.key"),
// cert: fs.readFileSync("/etc/pki/tls/certs/mdn-samples.mozilla.org.crt")
// }; /**
* @description 创建http server
*
*/
var httpsServer = https.createServer(function(request, response) {
console.log((new Date()) + " Received request for " + request.url);
response.writeHead(404);
response.end();
}); httpsServer.listen(6502, function() {
console.log((new Date()) + " Server is listening on port 6502");
}); console.log("***CREATING WEBSOCKET SERVER"); /**
*@description 创建WebSocketServer
*
*/
var wsServer = new WebSocketServer({
httpServer: httpsServer,
autoAcceptConnections: false
});
console.log("***CREATED"); function originIsAllowed(origin) {
// This is where you put code to ensure the connection should
// be accepted. Return false if it shouldn't be.
return true;
} function isUsernameUnique(name) {
var isUnique = true;
var i; for (i=0; i<connectionArray.length; i++) {
if (connectionArray[i].username === name) {
isUnique = false;
break;
}
}
return isUnique;
} function getConnectionForID(id) {
var connect = null;
var i; for (i=0; i<connectionArray.length; i++) {
if (connectionArray[i].clientID === id) {
connect = connectionArray[i];
break;
}
} return connect;
} function makeUserListMessage() {
var userListMsg = {
type: "userlist",
users: []
};
var i; // Add the users to the list for (i=0; i<connectionArray.length; i++) {
userListMsg.users.push(connectionArray[i].username);
} return userListMsg;
} function sendUserListToAll() {
var userListMsg = makeUserListMessage();
// console.log(111, userListMsg); var userListMsgStr = JSON.stringify(userListMsg);
var i;
// console.log(connectionArray); for (i=0; i<connectionArray.length; i++) {
//立即将指定的字符串作为UTF-8 WebSocket消息发送给远程对等体
console.log(100, userListMsgStr); connectionArray[i].sendUTF(userListMsgStr);
}
} console.log("***CRETING REQUEST HANDLER"); wsServer.on('request', function(request) {
console.log("Handling request from " + request.origin);
if (!originIsAllowed(request.origin)) {
request.reject();
console.log("Connection from " + request.origin + " rejected.");
return;
} // Accept the request and get a connection. var connection = request.accept("json", request.origin); // Add the new connection to our list of connections. console.log((new Date()) + " Connection accepted.");
connectionArray.push(connection);
// console.log(connectionArray); // Send the new client its token; it will
// respond with its login username. connection.clientID = nextID;
// console.log(connection.clientID); nextID++; var msg = {
type: "id",
id: connection.clientID
};
console.log(99, msg); connection.sendUTF(JSON.stringify(msg)); /**
* @description 接收消息
*/ connection.on('message', function(message) {
console.log("***Received MESSAGE*******", message);
if (message.type === 'utf8') {
// console.log("Received Message: " + message.utf8Data);ß // Process messages var sendToClients = true;
msg = JSON.parse(message.utf8Data);
// console.log(1111,msg); var connect = getConnectionForID(msg.id); /**
* @description 接收到的数据
*/ switch(msg.type) {
// Public text message in the chat room
case "message":
msg.name = connect.username;
msg.text = msg.text.replace(/(<([^>]+)>)/ig,"");
break;
/**
* @description 登录的操作,通知其他人展示
*/
// Username change request
case "username":
var nameChanged = false;
var origName = msg.name;
while (!isUsernameUnique(msg.name)) {
msg.name = origName + appendToMakeUnique;
appendToMakeUnique++;
nameChanged = true;
}
if (nameChanged) {
var changeMsg = {
id: msg.id,
type: "rejectusername",
name: msg.name
};
console.log(101,changeMsg); connect.sendUTF(JSON.stringify(changeMsg));
}
connect.username = msg.name;
sendUserListToAll();
break;
} // Convert the message back to JSON and send it out
// to all clients.
/**
* @desciption 发送给客户端消息
*/
if (sendToClients) {
var msgString = JSON.stringify(msg);
var i; for (i=0; i<connectionArray.length; i++) {
console.log(102, msgString); connectionArray[i].sendUTF(msgString);
}
}
}
}); // Handle the WebSocket "close" event; this means a user has logged off
// or has been disconnected.
/**
* @description 关闭socket
*/
connection.on('close', function(connection) {
// console.log(connectionArray);
console.log(JSON.stringify(connection));
console.log((new Date()) + " Peer " + connection.remoteAddress + " disconnected."); connectionArray = connectionArray.filter(function(el, idx, ar) {
// console.log(el.connected); return el.connected;
});
sendUserListToAll(); // Update the user lists
// console.log(connectionArray); }); }); console.log("***REQUEST HANDLER CREATED");

  

参考文章

websocket 服务搭建的更多相关文章

  1. nodejs搭建简单的websocket服务端

    创建websocket服务端使用了nodejs-websocket ,首先要安装nodejs-websocket,在项目的目录下: npm install nodejs-websocket 1.搭建w ...

  2. Netty 搭建 WebSocket 服务端

    一.编码器.解码器 ... ... @Autowired private HttpRequestHandler httpRequestHandler; @Autowired private TextW ...

  3. JumpServer1.0 服务搭建

    JumpServer1.0 服务搭建 系统环境配置 setenforce 0 systemctl stop iptables.service systemctl stop firewalld.serv ...

  4. asp.net网站作为websocket服务端的应用该如何写

    最近被websocket的一个问题困扰了很久,有一个需求是在web网站中搭建websocket服务.客户端通过网页与服务器建立连接,然后服务器根据ip给客户端网页发送信息. 其实,这个需求并不难,只是 ...

  5. springboot+kurento+coturn+contos的视频通讯服务搭建

    springboot+kurento+coturn+contos的视频通讯服务搭建 服务器CentOS Linux release 7.9.2009 (Core) 本案例成功于20210628 1.默 ...

  6. 【Java分享客栈】SpringBoot整合WebSocket+Stomp搭建群聊项目

    前言 前两周经常有大学生小伙伴私信给我,问我可否有偿提供毕设帮助,我说暂时没有这个打算,因为工作实在太忙,现阶段无法投入到这样的领域内,其中有两个小伙伴又问到我websocket该怎么使用,想给自己的 ...

  7. C# WebSocket 服务端示例代码 + HTML5客户端示例代码

    WebSocket服务端 C#示例代码 using System; using System.Collections.Generic; using System.Linq; using System. ...

  8. ServiceStack.Hello——跨平台.net REST api服务搭建

    ServiceStack.Hello--跨平台.net REST api服务搭建 自己创建: https://github.com/ServiceStack/ServiceStack/wiki/Cre ...

  9. WCFRESTFul服务搭建及实现增删改查

    WCFRESTFul服务搭建及实现增删改查 RESTful Wcf是一种基于Http协议的服务架构风格,  RESTful 的服务通常是架构层面上的考虑. 因为它天生就具有很好的跨平台跨语言的集成能力 ...

随机推荐

  1. Linux笔记1-简介

    以下为观看兄弟连视频教程所记. 1.简介 1965年,MIT.GE.AT&T的贝尔实验室 --> Multics 分时.庞大 1969年,贝尔实验室的肯·汤普森 --> Unix ...

  2. 全栈开发系列学习2——django项目搭建

    项目代码:http://yunpan.cn/cHajgT4HvgHqx (提取码:8350) 配置项目: 1. 首先确保你的机器安装了python和pip,这两种安装比较简单,这里就不说了. 2. 在 ...

  3. python车牌精确定位

    #coding=utf-8 import cv2 # 使用的是HyperLPR已经训练好了的分类器 watch_cascade = cv2.CascadeClassifier('model/casca ...

  4. Django组件——用户认证

    用户认证 一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1 .authentica ...

  5. java 抽象的概念 抽象类的使用

    package java10; /* 抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束 抽象类:抽象方法所在的类,必须是抽象类才行.在class之前写上abstract即可 如何 ...

  6. 解决js ajax跨越请求 Access control allow origin 异常

    // 解决跨越请求的问题 response.setHeader("Access-Control-Allow-Origin", "*");

  7. 423 Locked

    TortoiseSVN提交提示423 Locked的解决办法 . 此办法是阅读官方文档(TortoiseSVN-1.6.16-zh_CN.pdf) 4.21 锁部分提供的办法: 首先选择选择要提交的文 ...

  8. MySQL使用版本号实现乐观锁

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11608581.html 乐观锁适用于读多写少的应用场景  乐观锁Version图示 Project D ...

  9. .NET面试题集锦①

    一.前言部分 文中的问题及答案多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.面向对象的思想主要包括什么? 答:任何事物都可以理解为对象,其主要特征: 继承.封装.多态.特点:代码好维护,安 ...

  10. ExtJS5.0 菜鸟的第一天

    1.新项目开始啦,后台用户管理页面涉及到表格数据添加,修改内容比较多.准备用EXTJS框架搞下,对于我这种JS不咋地的人来说,还真是个挑战.整了2天,才搞出一个Hello,world!我也是醉了.. ...