Trasferimento file su socket

0

Sto provando a creare un semplice programma di trasferimento file che trasferisce un file da un server a un client. Ho provato io stesso semplicemente scrivendo il file su ObjectOutputStream . Questo non ha funzionato. Ho fatto qualche ricerca e ho trovato un'intera gamma di soluzioni che utilizzano un byte[] in cui il contenuto del file viene scritto su quell'array e scritto in OutputStream . Sfortunatamente nessuno degli scrittori spiega molto bene il codice.

Ero curioso di sapere se qualcuno potesse spiegarmi perché è necessario un byte[] per leggere il file rispetto alla mia soluzione o anche solo per leggere il contenuto del file in String e inviarlo. Di cosa si tratta un file e flussi che richiedono una soluzione come questa? Grazie per l'aiuto.

    
posta namarino 14.06.2017 - 07:41
fonte

1 risposta

2

Un stream è semplicemente una sequenza di oggetti . Se stai tentando di eseguire lo streaming di un file di tipo sconosciuto, ovvero stai semplicemente spingendo i dati grezzi e non interpretandone il contenuto, la rappresentazione abituale è un flusso di byte.

In Java, gli stream di oggetti sono progettati per inviare Oggetti . Anche se si invia un array di byte, invierà un oggetto array, non una sequenza di byte. Usano la serializzazione per inviare oggetti più complessi che includono metadati.

Sembra che tu voglia semplicemente la sequenza di byte che costituisce il contenuto del file.

Ci sono diversi modi per farlo funzionare, usando socket e stream della vecchia scuola o NIO. Suggerisco di iniziare con il vecchio modo in modo da capire come tutto funzioni, quindi passare a NIO (che in genere è solo un'astrazione di primitive di livello inferiore).

Il tuo server dovrebbe aprire ServerSocket e il client dovrebbe connettersi al server. Sul server si apre un flusso di output dal socket, mentre il client apre un flusso di input. Si noti che l'interfaccia socket utilizza le interfacce, non qualcosa come i flussi di oggetti. Se desideri flussi diversi, dovrai completarli.

Suggerisco di avvolgere ciascuno in un input o flusso di output bufferizzato e inviando i byte attraverso questo. La chiave qui è che entrambe le estremità del flusso devono utilizzare la stessa astrazione di flusso. Se un'estremità utilizza un flusso di oggetti e l'altra no, non funzionerà. Richiedendo i flussi dai socket, funzionerà: restituiscono implementazioni private che racchiudono il socket e sono compatibili.

Una volta capito come tutte le parti combaciano, suggerisco di passare a NIO, il che rende tutto molto più semplice, ma nasconde dettagli importanti di cui sembra necessario conoscere prima di poterli estrarre in modo sicuro.

    
risposta data 14.06.2017 - 08:05
fonte

Leggi altre domande sui tag