I’m trying to achieve bidirectionality of messages, but messages from Chat B are not displayed in Chat A and I don’t understand why, if it’s a server or client side problem
from starlette.applications import Starlette
from starlette.responses import HTMLResponse
from starlette.websockets import WebSocketDisconnect
from starlette.routing import Route, WebSocketRoute, Mount
from starlette.staticfiles import StaticFiles
import base64
connected_websockets = {}
async def websocket_endpoint(websocket):
await websocket.accept()
connected_websockets[id(websocket)] = websocket
try:
while True:
data = await websocket.receive_text()
if data.startswith('ChatA:'):
# Handle message from Chat A
data = data[6:] # Remove the prefix
for ws_id, ws in connected_websockets.items():
if ws_id != id(websocket):
await ws.send_text(f"Received from ChatA: {data}")
elif data.startswith('ChatB:'):
# Handle message from Chat B
data = data[6:] # Remove the prefix
for ws_id, ws in connected_websockets.items():
if ws_id != id(websocket):
await ws.send_text(f"Received from ChatB: {data}")
elif data.startswith('data:'):
# This is a data URL, handle it as a file
await handle_file(data, websocket)
except WebSocketDisconnect:
del connected_websockets[id(websocket)]
async def handle_file(data_url, websocket):
# Extract the file type and data from the URL
file_type, data = data_url.split(';')[0].split('/')[1], data_url.split(',')[1]
# Decode the base64 data
file_data = base64.b64decode(data)
# Now you can save the file data to a file, or do whatever you want with it
with open('received.' + file_type, 'wb') as f:
f.write(file_data)
await websocket.send_text(f"File received: received.{file_type}")
routes = [
WebSocketRoute("/ws", websocket_endpoint),
Mount("/", StaticFiles(directory="static"), name="static") # Aggiungi questa linea
]
app = Starlette(routes=routes)
client side
var socketA = new WebSocket('ws://localhost:8001/ws');
var socketB = new WebSocket('ws://localhost:8001/ws');
var fileToSend = null;
$('#form-send').submit(function(e){
e.preventDefault();
if (fileToSend) {
var reader = new FileReader();
reader.onload = function(e) {
var contents = e.target.result;
console.log('Sending file from ChatA: ', fileToSend.name); // Log added
socketA.send(contents);
$('#sent-messages').append($('<li>').text('Sent: ' + fileToSend.name));
fileToSend = null;
};
reader.readAsDataURL(fileToSend);
} else {
var message = 'ChatA:' + $('#input-send').val();
console.log('Sending message from ChatA: ', message); // Log added
socketA.send(message);
$('#sent-messages').append($('<li>').text('Sent: ' + message));
$('#input-send').val('');
}
});
socketA.onmessage = function(event){
var msg = event.data;
console.log('Received message at ChatA: ', msg); // Log added
if (msg.startsWith('File received:')) {
var filename = msg.split(': ')[1];
$('#received-messages').append($('<li>').html('Received: <a href="' + filename + '" download>' + filename + '</a>'));
} else {
$('#received-messages').append($('<li>').text('Received: ' + msg));
}
};
$('#form-receive').submit(function(e){
e.preventDefault();
var message = 'ChatB:' + $('#input-receive').val();
console.log('Sending message from ChatB: ', message); // Log added
socketB.send(message);
$('#received-messages').append($('<li>').text('Sent: ' + message));
$('#input-receive').val('');
});
socketB.onmessage = function(event){
var msg = event.data;
console.log('Received message at ChatB: ', msg); // Log added
if (msg.startsWith('File received:')) {
var filename = msg.split(': ')[1];
$('#received-messages').append($('<li>').html('Received: <a href="' + filename + '" download>' + filename + '</a>'));
} else {
$('#received-messages').append($('<li>').text('Received: ' + msg));
}
};
var dropZone = document.getElementById('sent-messages');
dropZone.addEventListener('dragover', function(e) {
e.preventDefault();
e.stopPropagation();
e.dataTransfer.dropEffect = 'copy';
});
dropZone.addEventListener('drop', function(e) {
e.preventDefault();
e.stopPropagation();
var files = e.dataTransfer.files;
if (files.length > 0) {
fileToSend = files[0];
$('#input-send').val('File: ' + fileToSend.name);
}
});
As you can see from the image the messages sent from chat A are displayed in chat B, but the messages sent from chat B are not displayed in chat A, but are displayed in the same chat, which is a problem