2009-07-10 17 views

Respuesta

4

enviar y recibir archivos

El envío y la recepción de un archivo básicamente se descompone en dos simples trozos de código.

código que recibe:

ServerSocket serverSoc = new ServerSocket(LISTENING_PORT); 

Socket connection = serverSoc.accept(); 

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

código de envío:

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); 

La pieza envío de código se ejecutó en el equipo que está enviando el código cuando se quieren enviar un archivo.

El código de recepción debe colocarse dentro de un bucle, de modo que cada vez que alguien quiera conectarse al servidor, el servidor pueda manejar la solicitud y luego volver a esperar en serverSoc.accept().

Para permitir el envío de archivos entre ambas computadoras, cada computadora necesitará ejecutar el servidor (recibiendo código) para escuchar los archivos entrantes, y ambos necesitarán ejecutar el código de envío cuando deseen enviar un archivo.

Barra de progreso

El JProgressBar de oscilación es bastante fácil de usar.Sin embargo, hacer que funcione correctamente y mostrar el progreso actual de la transferencia de archivos es un poco más difícil.

Para que aparezca una barra de progreso en un formulario, solo se debe colocar en un JFrame y quizás configurar setIndeterminate(false) para que muestre que su programa está funcionando.

Para implementar correctamente una barra de progreso, deberá crear su propia implementación de SwingWorker. Los tutoriales de Java tienen un buen ejemplo de esto en su lesson in concurrency.

Este es un problema bastante difícil por sí solo. Yo recomendaría hacer esto en su propia pregunta si necesita más ayuda.

+0

@jjinguy ¿qué dirección IP debemos poner para CONNECTION_ADDRESS si las computadoras no están en una LAN? Por ejemplo, mi dirección IP externa es 1.2.3.4 pero si coloca 1.2.3.4 como CONNECTION_ADDRESS, ¿cómo va a saber el enrutador a qué computadora (dentro de mi red doméstica) reenviará el paquete? – Pacerier

+0

@Pacerier Su enrutador debe manejar la traducción de la dirección por usted. – jjnguy

+0

@jjinguy, sí, pero ¿cómo se supone que el emisor debe saber * a qué * puerto enviar el paquete para que se enrute correctamente? más en http://superuser.com/questions/483033/how-does-peer-to-peer-work-over- the-internet – Pacerier

1

Puede escribir una usando la programación Socket en Java. Debería escribir un Servidor y un programa de Cliente. El servidor usaría un ServerSocket para escuchar las conexiones, y el Cliente usaría un Socket para conectarse a ese servidor en el puerto especificado.

Aquí hay un tutorial: http://www.javaworld.com/jw-12-1996/jw-12-sockets.html

+0

¿Por qué reinventar la rueda? –

+0

¿Por qué no? Es bastante rápido de hacer, y sería en Java. – AlbertoPL

+0

¡Lo acabo de hacer! – jjnguy

0

Salida this tutorial, es un ejemplo muy básico. Probablemente también desee enviar encabezados de control antes de que se envíe el archivo real, que contiene el tamaño del archivo, nombre de archivo, etc.

O bien, puede basarlo en un protocolo existente, como this project.

+0

Gracias eso es lo que estaba buscando. –

3

Consideraría seriamente usar FTP. Apache tiene un FTP client y una edición server

: la sugerencia de spdenne de HTTP también es bueno, especialmente si todo el mundo tiene Java 6. Si no es así, se puede usar algo como Tiny Java Web Server.

+0

sí, podría ... pero quería algo tan simple como fuera posible para que los principiantes no necesitaran instalar nada ... además de instalar Java, que creo que la mayoría de la gente ya tiene. –

+2

Definitivamente va a necesitar un código por encima del JRE. La única pregunta es si estás escribiendo ese código tú mismo o usando las bibliotecas existentes. Si lo escribe usted mismo, probablemente no sea estándar y tendrá que mantenerlo usted mismo. –

0

¿Puede instalar servidores FTP en (una de) sus máquinas?

Si puede, solo tendrá que usar un cliente FTP (FileZilla, por ejemplo, que tiene una barra de progreso).

1

Sun's Java 6 incluye un peso ligero HTTP server API y la implementación. Puede usar esto fácilmente para servir su archivo, usando URLConnection para obtenerlo.

0

Dos aplicaciones populares son "SCP" y "rsync". Estos son estándar en Linux, generalmente están disponibles en Unix y se pueden ejecutar en Windows bajo cygwin, aunque es posible que pueda encontrar aplicaciones nativas de Windows que también lo puedan hacer. (PuTTY puede servir como un cliente SCP).

Para cualquier tipo de transferencia de archivos de PC a PC, necesita tener un oyente en la PC de destino. Esta puede ser una aplicación de daemon (o proceso de sistema de Windows) o puede ser un "superservidor" de estilo Unix que está configurado para cargar y ejecutar la aplicación de copia de archivo real cuando alguien contacta el puerto de escucha.

SCP y uno de los modos rsync requieren que haya algún tipo de capacidad de inicio de sesión remoto. Rsync también puede publicar recursos que manejará el directorio. Como el concepto de "inicio de sesión remoto" de Windows no está tan bien establecido como en Linux, puede ser preferible. Además, limita el acceso remoto a fuentes/destinos definidos en la máquina de destino en lugar de permitir el acceso a cualquier parte (autorizada) del sistema de archivos.

0

Para transferir a través de una red de manera más eficiente. Eche un vistazo a this article que explica la transferencia eficiente de datos a través de copia cero

Cuestiones relacionadas