2015-06-29 20 views
16

Sto lavorando a un'applicazione di messaggistica utilizzando Spring Websockets (STOMP come sottoprotocollo) e Sockjs.Invio di immagini/file su Sockjs + Spring Websocket + Stomp

Dovrei fornire supporto per inviare file nei messaggi.

In base a this ticket, sockjs non supporta i dati binari, ma lo fa STOMP.

So che possiamo convertire l'immagine in base64 e inviarlo su stomp, ma penso che questa non sia la migliore pratica in quanto vi è molta conversione e sovraccarico. Devo anche salvare i messaggi, quindi per salvare nuovamente questi file codificati Base64 sul server dovrò decodificarli.

Ho paio di domande:

1) Esiste una soluzione alternativa per inviare immagini/files sopra sockjs + Stomp o conversione in Base64 è l'unico modo?

2) Può essere una domanda molto sciocca ma in base a this question è possibile inviare dati binari su STOMP (senza sockjs). Quanto è difficile supportare la fallback senza sockjs?

Grazie.

EDIT: Se si utilizza base64 è l'unica opzione, avrei preferito fare una richiesta POST per salvare i messaggi che ha gli allegati invece di utilizzare la codifica Base64. Qualche idea che sia migliore?

risposta

5

Qualsiasi implementazione di Web Socket gestirà dati binari se è codificata in Base64. Questo serializza essenzialmente un flusso binario in una stringa. Tutti i trasporti di socket e i wrapper possono gestire i dati di stringa. Qualsiasi implementazione Java base64 dovrebbe funzionare.

Sul lato browser base64 viene gestito in modo nativo nei browser moderni con btoa() e atob(). Se supporti i browser legacy potresti aver bisogno di un polyfill.

Detto questo, se il server Java sta solo trasmettendo messaggi tra utenti Web, non sarà necessario decodificare le immagini in Java, si passerebbero semplicemente le immagini codificate con stringhe da una connessione socket a un'altra.

+0

l'implementazione di websocket semplice supporta i dati binari, ne sono a conoscenza. Ma sto specificatamente cercando di scoprire se c'è qualche trucco/inversione di tendenza per 'SockJS'. – Karthik

+0

So che possiamo usare la codifica base64, ma stavo cercando delle alternative, perché questa applicazione ha messaggi molto frequenti con allegati. Quindi, usare base64 aumenta inutilmente le dimensioni. – Karthik

+0

Ma lo streaming, o semplicemente codificare in una sola azione di stringa prima di inviare. In altre parole, è efficiente utilizzare WebSockets per questo scopo? – Marc

0

Hai un aspetto binaryjs. è promessa lo streaming binario in tempo reale per il web tramite websocket.

lascia controllare gli esempi

https://github.com/binaryjs/binaryjs/tree/master/examples

Si dovrebbe controllare Atmosphere(wasync), collegamento vi guiderà alla modalità di attuazione.

per quanto compresso lo scenario di fallback del browser sul lato client è possibile utilizzare [base64 polyfill lib (https://github.com/davidchambers/Base64.js/).

migliori saluti

+0

Penso che tu abbia frainteso la mia domanda, non stavo cercando qualcosa che supporti il ​​binario, sto cercando un modo per inviare dati binari su SockJS. – Karthik

+0

Perché stai cercando dati binari di trasferimento, specialmente tramite SockJS, stai cercando di supportare i vecchi browser o un altro motivo? – daimon

+0

Sì, non voglio implementare le opzioni di fallback da solo. – Karthik

0

Un'altra alternativa sarebbe quella di utilizzare WebRTC solo per l'invio delle immagini binarie. Uno dei vantaggi di questo è che questi messaggi siano puramente peer-to-peer. Dovresti implementarlo solo nella tua app Web e non nel tuo back-end. Non avresti quindi bisogno di pagare la larghezza di banda utilizzata per le immagini. Sfortunatamente, WebRTC non è supportato da IE.

+0

questo non risolverà il problema giusto? Devo salvare i messaggi nel server. La messaggistica offline non sarà possibile con WebRTC. – Karthik

+0

Sì. Non so perché si desidera utilizzare websockets per inviare dati binari se questa non è un'applicazione in tempo reale. Avrebbe più senso usare il caricamento multipart se si stanno accodando messaggi. – Martin

+0

Un utente può chattare con utenti diversi che sono in linea tramite un connettore WebSocket, Se vuole inviare un messaggio a un utente non in linea, posso usare la stessa connessione websokcet. Perché il cliente dovrebbe preoccuparsi se l'utente è online o no? – Karthik

Problemi correlati