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.