<!DOCTYPEhtml><htmllang="en"><head> <metacharset="UTF-8"> <title>WebSocket Chat</title> <style>#chatbox {height:300px;border:1pxsolidblack;padding:10px;overflow-y:scroll; }#messageInput {width:80%; } </style></head><body><divid="chatbox"></div><inputtype="text"id="usernameInput"placeholder="Enter your username"><buttononclick="connect()">Connect</button><br><br><inputtype="text"id="messageInput"placeholder="Type your message"><buttononclick="sendMessage()">Send</button><scriptsrc="chat.js"></script></body></html>
chat.js
let socket;let username;functionconnect() { username = document.getElementById('usernameInput').value;if (!username) returnalert('Please enter a username.'); socket =newWebSocket('ws://your-websocket-server.com/chat'); // Replace with your WebSocket server address socket.addEventListener('open', (event) => { console.log('Connected to WebSocket server'); document.getElementById('usernameInput').disabled =true;sendMessage(username +' has joined the chat!'); }); socket.addEventListener('message', (event) => {addMessageToChat(event.data); }); socket.addEventListener('close', (event) => { console.log('Disconnected from WebSocket server'); }); socket.addEventListener('error', (error) => { console.error('WebSocket error:', error); });}functionsendMessage(message) {if (!socket || socket.readyState !== WebSocket.OPEN) return;if (!message.trim()) return; socket.send(username +': '+ message);addMessageToChat(username +': '+ message); document.getElementById('messageInput').value =''; // Clear input field}functionaddMessageToChat(message) {const chatBox = document.getElementById('chatbox');const messageElement = document.createElement('p'); messageElement.textContent = message; chatBox.appendChild(messageElement); chatBox.scrollTop = chatBox.scrollHeight; // Auto-scroll to bottom}
Backend Node.js Server Implementation
server.js
const WebSocket =require('ws');const server =new WebSocket.Server({ port:8080 });const clients =newSet();server.on('connection', (socket) => { console.log('Client connected'); clients.add(socket); socket.on('message', (message) => { console.log(`Received: ${message}`);// Broadcast message to all clientsfor (const client of clients) {if (client.readyState === WebSocket.OPEN) { client.send(message); } } }); socket.on('close', () => { console.log('Client disconnected'); clients.delete(socket); }); socket.on('error', (err) => { console.error('Socket error:', err); });});console.log('WebSocket server is running on port 8080');
Server Logic Explanation
Import ws Library: The ws library is imported using require('ws').
Create WebSocket Server: A WebSocket server listening on port 8080 is created with new WebSocket.Server({ port: 8080 }).
Client Collection: A Set is used to store all connected client socket instances.
Connection Event Handling: When a client connects, the new socket is added to the clients set, and a connection log is printed.
Message Event Handling: Upon receiving a message from a client, the server iterates through the clients set, sending the message to every client in the OPEN state, effectively broadcasting the message.
Close and Error Event Handling: Handles client disconnections and errors by removing disconnected clients from the set and logging relevant information.