So im trying to integrate my first websocket, to work on a basic chat system.
My main issue is, I cant get the client to connect to the socket.
However I can connect when using websocat on 127.0.0.1 host, this has allowed me to identify this as a client side issue. Please do let me know why this is happening, and should my client code look good, I am able to try this from another device as it may be, however likely isn’t, my connection causing the connection to break.
my chat.js:
// Debugging flag
let debugMode = true; // Set to false to disable console logs
// Function to format the date
function formatDate(dateString) {
const date = new Date(dateString);
if (isNaN(date.getTime())) {
return 'Invalid date'; // Handle invalid date
}
return date.toLocaleTimeString(); // Format the date to local time string
}
// Function to display messages in the chat UI
function displayMessage(message) {
const messagesContainer = document.getElementById('messages');
// Create message element
const messageElement = document.createElement('div');
messageElement.classList.add('flex', 'items-start', 'max-w-xs');
// Check if the message is sent or received
if (message.senderPublic === puba) { // Replace with actual public key
messageElement.classList.add('ml-auto');
messageElement.innerHTML = `
<div class="ml-auto text-right">
<div class="bg-blue-600 rounded-lg p-3 text-white">
${message.message}
</div>
<p class="text-gray-500 text-xs mt-1 text-right">${formatDate(message.date)}</p>
</div>
`;
} else {
messageElement.innerHTML = `
<img src="https://storage.googleapis.com/workspace-0f70711f-8b4e-4d94-86f1-2a93ccde5887/image/e359ba49-2440-4fce-934f-7d2db6d4d05b.png" alt="Sender" width="36" height="36" class="rounded-full mr-3 w-9 h-9">
<div>
<div class="bg-gray-700 rounded-lg p-4 text-gray-200 text-xl">
${message.message}
</div>
<p class="text-gray-500 text-sm mt-2">${formatDate(message.date)}</p>
</div>
`;
}
// Append the message to the container
messagesContainer.appendChild(messageElement);
lastMessageId = message.id; // Update last message ID
}
// Function to request new messages
function requestNewMessages(socket) {
socket.send(`messages ${lastMessageId}`);
logDebug('Requested new messages');
}
// Debug logging function
function logDebug(...messages) {
if (debugMode) {
console.log(...messages);
}
}
let lastMessageId = 0;
logDebug('WebSocket connection opening');
// Event listener for when the connection is opened
my tag on the actual page
<script>
// Toggle dropdown visibility
document.getElementById('createChatBtn').addEventListener('click', function() {
const dropdown = document.getElementById('dropdown');
dropdown.classList.toggle('hidden');
});
const socket = new WebSocket('ws://127.0.0.1:8080<%=request.getContextPath()%>/ws/chat/<%=Base64.getEncoder().encodeToString(request.getSession().getAttribute("token").toString().getBytes())%>/<%=chatId%>');
const puba = '<%=wallet.getPublicKey()%>';
socket.addEventListener('open', function (event) {
logDebug('WebSocket connection opened & authenticated');
});
socket.addEventListener('message', function (event) {
const messageData = JSON.parse(event.data);
logDebug('Received message:', messageData);
displayMessage(messageData);
});
socket.addEventListener('error', function (event) {
console.error('WebSocket error:', event);
});
socket.addEventListener('close', function (event) {
console.log('WebSocket connection closed:', event);
});
var millisecondsToWait = 10000;
setTimeout(function() {
setInterval(requestNewMessages(socket), 5000);
}, millisecondsToWait);
</script>
My error dump:
(index):64 cdn.tailwindcss.com should not be used in production. To use Tailwind CSS in production, install it as a PostCSS plugin or use the Tailwind CLI: https://tailwindcss.com/docs/installation
(anonymous) @ (index):64
(anonymous) @ (index):64
chat.js:59 WebSocket connection opening
chat?id=33:146 WebSocket connection to 'ws://127.0.0.1:8080/5resrerw253/ws/chat/M2hpSmJkUCQ4JHJONiMj/33' failed:
(anonymous) @ chat?id=33:146
chat?id=33:157 WebSocket error: Event {isTrusted: true, type: 'error', target: WebSocket, currentTarget: WebSocket, eventPhase: 2, …}isTrusted: truebubbles: falsecancelBubble: falsecancelable: falsecomposed: falsecurrentTarget: WebSocket {url: 'ws://127.0.0.1:8080/5resrerw253/ws/chat/M2hpSmJkUCQ4JHJONiMj/33', readyState: 3, bufferedAmount: 0, onopen: null, onerror: null, …}defaultPrevented: falseeventPhase: 0returnValue: truesrcElement: WebSocket {url: 'ws://127.0.0.1:8080/5resrerw253/ws/chat/M2hpSmJkUCQ4JHJONiMj/33', readyState: 3, bufferedAmount: 0, onopen: null, onerror: null, …}target: WebSocket {url: 'ws://127.0.0.1:8080/5resrerw253/ws/chat/M2hpSmJkUCQ4JHJONiMj/33', readyState: 3, bufferedAmount: 0, onopen: null, onerror: null, …}timeStamp: 4215.5type: "error"[[Prototype]]: Event
(anonymous) @ chat?id=33:157
chat?id=33:160 WebSocket connection closed: CloseEvent {isTrusted: true, wasClean: false, code: 1006, reason: '', type: 'close', …}
chat.js:51 WebSocket is already in CLOSING or CLOSED state.
requestNewMessages @ chat.js:51
(anonymous) @ chat?id=33:164
setTimeout
(anonymous) @ chat?id=33:163
chat.js:59 Requested new messages