2009-07-10 11 views

risposta

4

Invio e ricezione di file

L'invio e la ricezione di un file rompe sostanzialmente verso il basso per due semplici pezzi di codice.

codice Recieving:

ServerSocket serverSoc = new ServerSocket(LISTENING_PORT); 

Socket connection = serverSoc.accept(); 

// code to read from connection.getInputStream(); 

codice di invio:

File fileToSend; 
InputStream fileStream = new BufferedInputStream(fileToSend); 

Socket connection = new Socket(CONNECTION_ADDRESS, LISTENING_PORT); 
OutputStream out = connection.getOutputStream(); 

// my method to move data from the file inputstream to the output stream of the socket 
copyStream(fileStream, out); 

Il pezzo invio del codice verrà correva sul computer che invia il codice quando vogliono inviare un file.

Il codice ricevente deve essere inserito in un ciclo, in modo che ogni volta che qualcuno vuole connettersi al server, il server può gestire la richiesta e quindi tornare ad attendere su serverSoc.accept().

Per consentire l'invio di file tra entrambi i computer, ciascun computer dovrà eseguire il server (codice ricevente) per ascoltare i file in arrivo e entrambi dovranno eseguire il codice di invio quando desiderano inviare un file.

Progress Bar

Il JProgressBar in Swing è abbastanza facile da usare.Tuttavia, farlo funzionare correttamente e mostrare i progressi attuali del trasferimento dei file è leggermente più difficile.

Per visualizzare una barra di avanzamento su un modulo, è sufficiente rilasciarlo su un JFrame e forse impostare setIndeterminate(false) in modo che indichi che il programma funziona.

Per implementare correttamente una barra di avanzamento è necessario creare la propria implementazione di SwingWorker. Le esercitazioni Java hanno un buon esempio di ciò nel loro lesson in concurrency.

Questo è un problema abbastanza difficile da soli. Consiglierei di chiedere questo nella sua stessa domanda se hai bisogno di ulteriore aiuto.

+0

@jjinguy quale indirizzo IP dovremmo inserire per CONNECTION_ADDRESS se i computer non sono in una LAN? Ad esempio, il mio indirizzo IP esterno è 1.2.3.4 ma se inserisci 1.2.3.4 come CONNECTION_ADDRESS, come farà il router a sapere quale computer (all'interno della mia rete domestica) deve inoltrare il pacchetto? – Pacerier

+0

@Pacerier Il router deve gestire la traduzione degli indirizzi per voi. – jjnguy

+0

@jjinguy, sì ma come si suppone che il mittente conosca * quale * porta per inviare il pacchetto in modo tale che sia correttamente instradato? Maggiori informazioni su http://superuser.com/questions/483033/how-does-peer-to-peer-work-over-the-internet – Pacerier

1

È possibile scriverne uno utilizzando la programmazione Socket in Java. Dovresti scrivere un server e un programma client. Il server userebbe un ServerSocket per ascoltare le connessioni e il Client userebbe un Socket per connettersi a quel server sulla porta specificata.

Ecco un tutorial: http://www.javaworld.com/jw-12-1996/jw-12-sockets.html

+0

Perché reinventare la ruota? –

+0

Perché no? È abbastanza veloce da fare, e sarebbe in Java. – AlbertoPL

+0

L'ho appena fatto! – jjnguy

0

Partenza this tutorial, si tratta di un esempio molto semplice. Probabilmente vorresti anche inviare le intestazioni di controllo prima che il vero file venga inviato, contenente le dimensioni del file, nome file, ecc.

In alternativa, basarlo su un protocollo esistente, come il progetto this.

+0

Grazie è quello che stavo cercando. –

3

Prenderemo seriamente in considerazione l'utilizzo di FTP. Apache ha un FTP client e Modifica server

: suggerimento di spdenne di HTTP è anche un bene, soprattutto se ognuno di noi ha di Java 6. In caso contrario, è possibile usare qualcosa come Tiny Java Web Server.

+0

sì, potrei .. ma volevo qualcosa il più semplice possibile in modo che i principianti non avessero bisogno di installare nulla ... a parte l'installazione di Java che penso che la maggior parte delle persone già abbia. –

+2

Avrai sicuramente bisogno del codice oltre a JRE. L'unica domanda è se stai scrivendo quel codice tu stesso, o usando le librerie esistenti. Se lo scrivi tu stesso, probabilmente sarà non standard e dovrai mantenerlo da solo. –

0

È possibile installare server FTP su (uno dei) computer?

Se è possibile, sarà sufficiente utilizzare un client FTP (FileZilla ad esempio, che dispone di una barra di avanzamento).

1

Sun's Java 6 include un peso leggero HTTP server API e implementazione. Potresti usarlo abbastanza facilmente per servire il tuo file, usando URLConnection per ottenerlo.

0

Due applicazioni popolari sono "SCP" e "rsync". Questi sono standard su Linux, sono generalmente disponibili su Unix e possono essere eseguiti su Windows sotto cygwin, anche se potresti essere in grado di trovare app native di Windows che possono farlo anche tu. (PuTTY può servire come client SCP).

Per qualsiasi tipo di trasferimento di file da PC a PC, è necessario disporre di un listener sul PC di destinazione. Può trattarsi di un'app daemon (o del processo di sistema di Windows) oppure di un "superserver" in stile Unix configurato per caricare ed eseguire l'app di copia dei file quando qualcuno contatta la porta di ascolto.

SCP e una delle modalità rsync richiedono l'esistenza di una sorta di funzionalità di accesso remoto. Rsync può anche pubblicare risorse che gestirà la directory. Dal momento che il concetto di "login remoto" di Windows non è così consolidato come in Linux, potrebbe essere preferibile. Inoltre limita l'accesso remoto a sorgenti/destinazioni definite sulla macchina di destinazione invece di consentire l'accesso a qualsiasi parte (autorizzata) del filesystem.

0

Per trasferire su una rete in modo più efficiente. Dai uno sguardo allo this article che spiega il trasferimento efficiente dei dati attraverso la copia zero

Problemi correlati