链接过程

前端

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. XMPP即时通讯协议使用(前传)——协议详解

    XMPP详解 XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理和现场协议)是一种在两个地点间传递小型结构化数据的协议.在此基础上,XMPP ...

  2. OC学习--OC中的类--类的定义,成员变量,方法

    1. 类的定义 >用关键字@interface进行声名  @end 结束 >所有的类有一个基类NSobject >类名 也是标示符 第一个字母大写 如果多个字母组成 每个单词的首字母 ...

  3. gcc版本切换

    查看安装的gcc版本 sudo update--alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 100 显示所有版本gcc路径 sudo ...

  4. PHP中的魔术方法总结:__construct,__destruct ,__call,__callStatic,__get,__set,__isset, __unset ,__sleep,__wakeup,__toString,__set_state,__clone,__autoload

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...

  5. 五、Angular定义字段、绑定字段、获取数据、对象获取数据、*ngFor循环获取数据,自定义方法、*ngIf条件判断、双向数据绑定

    1.定义属性 2.绑定属性.绑定html中 3.循环获取数据 编写的时候没有注意,第二个循环 i 需要改成 {{i}} ,这样才会显示 出效果 4.自定义方法 变量名截图省略 5.*ngIf条件判断 ...

  6. java 局部变量与成员成员变量的区别

    package java04; /* 局部变量和成员变量的不同: 1.定义的位置不一样 局部变量:定义在方法内部 成员变量:在方法外部,直接写在类中 2.作用范围不一样 局部变量:只有方法中能使用,除 ...

  7. day19 python模块 json模块 pickle模块

    day19 python   一.序列化模块     序列类型: 列表 字符串 元组 bytes     序列化: 特指字符串和bytes, 就是把其他的数据类型转化成序列的数据类型的过程 dic = ...

  8. BZOJ4710 [Jsoi2011]分特产 容斥

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4710 题解 本来想去找一个二项式反演的题的,结果被 https://www.cnblogs.c ...

  9. 关于touch-action

    在项目中发现 ,Android下列表页的滚动加载失效. 原因: css中设定了html{ touch:none } 解决方法:移除该样式. touch:none // 当触控事件发生在元素上是时,不进 ...

  10. iis7反向代理

    很多站长通常在Linux系统下使用nginx作为前端server,通过反向代理间接访问其他webserver.那么如果用户安装的是Windows系统的话,又改如何实现反向代理的设置呢?搜索引擎大全 下 ...