nodejs搭建一个webscoket服务器【转】

//引入ws模块

var WebSocket = require( 'ws' );

//创建websocket服务,端口port为:****

var WebSocketServer = WebSocket.Server,
wss =  new WebSocketServer({ port: 8180 });

//引入uuid模块

var uuid = require( 'uuid' );

//定义一个空数组,存放客户端的信息

var clients = [];

//定义发送消息方法wsSend

//参数为 type:类型

//client_uuid:随机生成的客户端id

//nickname:昵称

//message:消息

//clientcount:客户端个数

function wsSend(type, client_uuid, nickname, message, clientcount) {
//遍历客户端
for ( var i = 0; i < clients.length; i++) {
//&#x58F0;&#x660E;&#x5BA2;&#x6237;&#x7AEF;
var clientSocket = clients[i].ws;
if (clientSocket.readyState === WebSocket.OPEN) {
//&#x5BA2;&#x6237;&#x7AEF;&#x53D1;&#x9001;&#x5904;&#x7406;&#x8FC7;&#x7684;&#x4FE1;&#x606F;
clientSocket.send(JSON.stringify({
"type" : type,
"id" : client_uuid,
"nickname" : nickname,
"message" : message,
"clientcount" : clientcount,
}));
}
}

//&#x58F0;&#x660E;&#x5BA2;&#x6237;&#x7AEF;index&#x9ED8;&#x8BA4;&#x4E3A;1

var clientIndex = 1;

//&#x670D;&#x52A1;&#x7AEF;&#x8FDE;&#x63A5;

wss.on( 'connection' ,&#xA0; function (ws) {
//&#x5BA2;&#x6237;&#x7AEF;client_uuid&#x968F;&#x673A;&#x751F;&#x6210;
var client_uuid = uuid.v4();
//&#x6635;&#x79F0;&#x4E3A;&#x6E38;&#x5BA2;+&#x5BA2;&#x6237;&#x7AEF;index
var nickname =&#xA0; "&#x6E38;&#x5BA2;" + clientIndex;
//client++
clientIndex += 1;
//&#x5C06;&#x65B0;&#x8FDE;&#x63A5;&#x7684;&#x5BA2;&#x6237;&#x7AEF;push&#x5230;clients&#x6570;&#x7EC4;&#x4E2D;
clients.push({&#xA0; "id" : client_uuid,&#xA0; "ws" : ws,&#xA0; "nickname" : nickname });
//&#x63A7;&#x5236;&#x53F0;&#x6253;&#x5370;&#x8FDE;&#x63A5;&#x7684;client_uuid
console.log( 'client [%s] connected' , client_uuid);
//&#x58F0;&#x660E;&#x8FDE;&#x63A5;&#x4FE1;&#x606F;&#x4E3A; &#x6635;&#x79F0;+&#x6765;&#x4E86;
// var connect_message = nickname + " &#x6765;&#x4E86;";
var connect_message =&#xA0; " &#x6765;&#x4E86;" ;
//&#x670D;&#x52A1;&#x5668;&#x5E7F;&#x64AD;&#x4FE1;&#x606F; ***&#x6765;&#x4E86;
wsSend( "notification" , client_uuid, nickname, connect_message, clients.length);
//&#x5F53;&#x7528;&#x6237;&#x53D1;&#x9001;&#x6D88;&#x606F;&#x65F6;
ws.on( 'message' ,&#xA0; function (message) {
console.log( "message" , ArrayBufferUTF8ToStr(message));
// &#x7528;&#x6237;&#x8F93;&#x5165;"/nick"&#x7684;&#x8BDD;&#x4E3A;&#x91CD;&#x547D;&#x540D;&#x6D88;&#x606F;
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 =&#xA0; "&#x7528;&#x6237; " + old_nickname +&#xA0; " &#x6539;&#x540D;&#x4E3A;&#xFF1A; " + nickname;
wsSend( "nick_update" , client_uuid, nickname, nickname_message, clients.length);
}
}&#xA0; //&#x53D1;&#x9001;&#x6D88;&#x606F;
else {
wsSend( "message" , client_uuid, nickname, message, clients.length);
}
});
//&#x6BCF;&#x4E2A;&#x56FA;&#x5B9A;&#x7684;&#x65F6;&#x95F4; &#x670D;&#x52A1;&#x5668;&#x7ED9;&#x5BA2;&#x6237;&#x7AEF;&#x53D1;&#x9001;&#x6D88;&#x606F;
setInterval(() => {
if (ws.readyState == ws.OPEN){
let str =&#xA0; "&#x670D;&#x52A1;&#x5668;send" +Math.floor(Math.random()*100)
var msg = Buffer.from( str);
console.log(str);
wsSend( "message" , client_uuid, nickname, msg, clients.length);
} else {
console.log( "&#x8FD8;&#x6CA1;&#x6709;&#x63A5;&#x901A;" )
}
}, 3000);
//&#x5173;&#x95ED;socket&#x8FDE;&#x63A5;&#x65F6;
var closeSocket =&#xA0; function (customMessage) {
console.log( "------&#x5173;&#x95ED;------" )
//&#x904D;&#x5386;&#x5BA2;&#x6237;&#x7AEF;
for ( var i = 0; i < clients.length; i++) {
//&#x5982;&#x679C;&#x5BA2;&#x6237;&#x7AEF;&#x5B58;&#x5728;
if (clients[i].id == client_uuid) {
// &#x58F0;&#x660E;&#x79BB;&#x5F00;&#x4FE1;&#x606F;
var disconnect_message;
if (customMessage) {
disconnect_message = customMessage;
}&#xA0; else {
disconnect_message = nickname +&#xA0; " &#x8D70;&#x4E86;" ;
}
//&#x5BA2;&#x6237;&#x7AEF;&#x6570;&#x7EC4;&#x4E2D;&#x5220;&#x6389;
clients.splice(i, 1);
//&#x670D;&#x52A1;&#x5E7F;&#x64AD;&#x6D88;&#x606F;
wsSend( "notification" , client_uuid, nickname, disconnect_message, clients.length);
}
}
}
ws.on( 'close' ,&#xA0; function () {
closeSocket();
});
process.on( 'SIGINT' ,&#xA0; function () {
console.log( "Closing things" );
closeSocket( 'Server has disconnected' );
process.exit();
});

});

function ArrayBufferUTF8ToStr(array) {
var out,i,len,c;
var char2,char3;
if (array&#xA0; instanceof ArrayBuffer) {
array =&#xA0; new Uint8Array(array);
}
out =&#xA0; "" ;
len = array.length;
i = 0;
while (i < len) {
c = array[i++];
switch (c >> 4) {
case 0:&#xA0; case 1:&#xA0; case 2:&#xA0; case 3:&#xA0; case 4:&#xA0; case 5:&#xA0; case 6:&#xA0; case 7:
// 0xxxxxxx
out += String.fromCharCode(c);
break ;
case 12:&#xA0; case 13:
// 110x xxxx&#xA0;&#xA0; 10xx xxxx
char2 = array[i++];
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
break ;
case 14:
// 1110 xxxx&#xA0; 10xx xxxx&#xA0; 10xx xxxx
char2 = array[i++];
char3 = array[i++];
out += String.fromCharCode(((c & 0x0F) << 12) |
((char2 & 0x3F) << 6) |
((char3 & 0x3F) << 0));
break ;
}
}
return out;

Original: https://www.cnblogs.com/mazhenyu/p/16375441.html
Author: 3D入魔
Title: nodejs搭建一个webscoket服务器【转】

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/552670/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球