websocket
2023-09-27 14:25:55 时间
server端
var WebSocket = require('ws');
var WebSocketServer = WebSocket.Server,
wss = new WebSocketServer({port: 8181});
var uuid = require('node-uuid');
var clients = [];
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
}));
}
}
}
var clientIndex = 1;
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);
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();
});
process.on('SIGINT', function() {
console.log("Closing things");
closeSocket('Server has disconnected');
process.exit();
});
});
客户端
<!DOCTYPE html>
<html lang="en">
<head>
<title>Bi-directional WebSocket Chat Demo</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://bit.ly/cdn-bootstrap-css">
<link rel="stylesheet" href="http://bit.ly/cdn-bootstrap-theme">
<script src="http://bit.ly/cdn-bootstrap-jq"></script>
<script>
var ws = new WebSocket("ws://10.0.100.22:8181");
var nickname = "";
ws.onopen = function(e) {
console.log('Connection to server opened');
}
function appendLog(type, nickname, message) {
var messages = document.getElementById('messages');
var messageElem = document.createElement("li");
var preface_label;
if(type==='notification') {
preface_label = "<span class=\"label label-info\">*</span>";
} else if(type=='nick_update') {
preface_label = "<span class=\"label label-warning\">*</span>";
} else {
preface_label = "<span class=\"label label-success\">"
+ nickname + "</span>";
}
var message_text = "<h2>" + preface_label + " "
+ message + "</h2>";
messageElem.innerHTML = message_text;
messages.appendChild(messageElem);
}
ws.onmessage = function(e) {
var data = JSON.parse(e.data);
nickname = data.nickname;
appendLog(data.type, data.nickname, data.message);
console.log("ID: [%s] = %s", data.id, data.message);
}
ws.onclose = function(e) {
appendLog("Connection closed");
console.log("Connection closed");
}
function sendMessage() {
var messageField = document.getElementById('message');
if(ws.readyState === WebSocket.OPEN) {
ws.send(messageField.value);
}
messageField.value = '';
messageField.focus();
}
function disconnect() {
ws.close();
}
</script>
</head>
<body lang="en">
<div class="vertical-center">
<div class="container">
<ul id="messages" class="list-unstyled">
</ul>
<hr />
<form role="form" id="chat_form" οnsubmit="sendMessage(); return false;">
<div class="form-group">
<input class="form-control" type="text" id="message" name="message"
placeholder="Type text to echo in here" value="" autofocus/>
</div>
<button type="button" id="send" class="btn btn-primary"
οnclick="sendMessage();">Send Message</button>
</form>
</div>
</div>
<script src="http://bit.ly/cdn-bootstrap-minjs"></script>
</body>
</html>