A continuación, el artículo anterior se cargará y descargará.
5. RESUMEN EL PUNTO DE ROMPO
Para los programadores que están familiarizados con QQ, la función de transmisión continua del punto de interrupción de QQ debería ser muy impresionante. Porque es muy práctico y aspecto. Por lo tanto, durante nuestro proceso de carga y descarga, la función de la transmisión continua de punto de interrupción está muy bien implementada.
De hecho, el principio de la transmisión continua del punto de interrupción es muy simple. Durante el proceso de carga, vaya al servicio para averiguar si existe este archivo. Si existen algunos archivos, compare el tamaño del archivo en el servidor con el tamaño del archivo local. Si los archivos en el servidor son más pequeños que el local, se cree que la transmisión continua de punto de interrupción debería ser posible durante el proceso de carga de este archivo.
Durante la implementación, la clase RandomAccessFile se vuelve útil. Las instancias de esta clase admiten leer y escribir a archivos de acceso aleatorio. Los archivos de acceso aleatorio se comportan como una gran matriz de bytes almacenada en el sistema de archivos. Hay un cursor o índice que apunta a la matriz implícita, llamada puntero de archivo; La operación de entrada lee bytes del puntero del archivo y avanza el puntero del archivo a medida que se lee el byte. Si el archivo de acceso aleatorio se crea en modo de lectura/escritura, la operación de salida también está disponible; La operación de salida comienza con el puntero del archivo y avanza el puntero del archivo a medida que se escribe el byte. Una operación de salida después de escribir hasta el extremo actual de una matriz implícita hace que la matriz se expanda. El puntero del archivo se puede leer a través del método getFilePointer y establecer el método Seek.
El método Skipbytes de la clase RandomAccessFile intenta omitir la entrada de n bytes para descartar los bytes omitidos. Si encuentra el tamaño N del archivo que se cargará desde el servidor, puede usar el método Skipbytes para omitir estos n bytes y comenzar a realizar la transmisión continua de punto de interrupción desde un nuevo lugar. Para obtener métodos específicos, consulte la descripción de la API de JDK5.
Puede ver la implementación de la carga y descarga de la transmisión continua del punto de interrupción en el método Ejecutar de la clase DataConnection. El código es el siguiente:
public void run () {try {newline = con.getcrlf (); if (settings.getftppasvmode ()) {try {Sock = new Socket (host, puerto); sock.setsotimeout (settings.getSocketTimeout ()); } catch (excepción ex) {ok = false; debug ("No se puede abrir el socket en el puerto" + puerto); }} else {//log.debug("trying nuevo socket del servidor: "+puerto); intente {ssock = new ServerSocket (puerto); } catch (excepción ex) {ok = false; Log.debug ("No se puede abrir Serversocket en el puerto" + puerto); }}} capt (excepción ex) {debug (ex.ToString ()); } isthere = true; boolean ok = verdadero; RandomAccessFile fout = null; BufferedOutputStream Bout = NULL; RandomAccessFile fin = null; Pruebe {if (! settings.getftppasvMode ()) {int retry = 0; while ((Retry ++ <5) && (Sock == NULL)) {try {ssock.setSotimeOut (settings.connectionTimeOut); calcetín = ssock.accept (); } catch (ioException e) {sock = null; debug ("obtuve ioexception al intentar abrir un enchufe!"); if (retry == 5) {debug ("conexión fallida, probado 5 veces - tal vez intente un tiempo de espera más alto en settings.java"); } terminado = verdadero; tirar E; } finalmente {ssock.close (); } Debug ("Intente tiempo, reintento"); }} if (ok) {byte [] buf = new byte [settings.buffersize]; start = System.CurrentTimemillis (); int bufflen = 0; // ------------- fout = new RandomAccessFile (archivo, "RW"); fout.skipbytes ((int) f.length ()); bufflen = (int) f.length (); } else {if (localFile == null) {localFile = file; } Archivo f2 = nuevo archivo (settings.apphomedir); f2.mkdirs (); Archivo f = nuevo archivo (localfile); if (f.exists ()) {f.delete (); } bout = new BufferedOutputStream (nuevo FileOutputStream (LocalFile), settings.bufferSize); }} catch (Exception Ex) {debug ("No se puede crear el archivo de salida:" + archivo); OK = falso; Ex.PrintStackTrace (); }} // --------------- 上传 上传 ---------------------- if (type.equals (put) || type.equals (putDir)) {if (in == null) {try {fin = new RandomAccessFile (archivo, "r"); if (reanudar) {fin.skipbytes (skiplen); } // fin = new BufferedInputStream (new FileInputStream (File)); } Catch (Exception Ex) {debug ("No se puede abrir Entradafile:" + "(" + ex + ")"); OK = falso; }} if (ok) {try {out = new BufferedOutputStream (Sock.getOutputStream ()); } catch (excepción ex) {ok = false; debug ("No se puede obtener salidas"); } If (ok) {try {int len = skiplen; char b; while (true) {int read; if (in! = null) {read = in.read (buf); } else {read = fin.read (buf); } len += read; //System.out.println(file + "" + type + "" + len + "" + read); if (read == -1) {break; } if (newline! = null) {byte [] buf2 = modifyput (buf, read); out.write (buf2, 0, buf2.length); } else {out.write (buf, 0, read); } Con.FirRogresureUpdate (archivo, type, len); if (time ()) {// log.debugsize (len, false, false, archivo); } if (read == streamtokenizer.tt_eof) {break; }} out.flush (); //Log.debugsize(len, falso, true, archivo); } catch (ioException ex) {ok = false; debug ("Error: Conexión de datos cerrada"); con.FirRogresureUpdate (archivo, fallido, -1); Ex.PrintStackTrace (); }}}}}}} Catch (ioException ex) {log.debug ("No se puede conectar el socket a ServerSocket"); Ex.PrintStackTrace (); } finalmente {try {if (out! = null) {out.flush (); out.close (); }} capt (excepción ex) {ex.printstackTrace (); } try {if (bout! = null) {bout.flush (); BOUT.CLOSE (); }} capt (excepción ex) {ex.printstackTrace (); } try {if (fout! = null) {fout.close (); }} capt (excepción ex) {ex.printstackTrace (); } try {if (in! = null &&! juststream) {in.close (); } if (fin! = null) {fin.close (); }} capt (excepción ex) {ex.printstackTrace (); }} try {sock.close (); } catch (excepción ex) {debug (ex.ToString ()); } if (! settings.getftppasvmode ()) {try {ssock.close (); } catch (excepción ex) {debug (ex.ToString ()); }} terminado = true; if (ok) {con.fireProgressUpdate (archivo, terminado, -1); } else {con.fireProgressUpdate (archivo, fallido, -1); }} 6. Mapeo de puertos FTP
Hay dos tipos de conexiones de datos FTP: PASV y puerto. Si su servidor FTP se encuentra en la intranet, debe usar la asignación de puertos. Al principio, no sabía mucho sobre el mapeo de red externo de FTP, así que comencé a tomar muchos desvíos. Al principio, siempre pensé que había algo mal en mi programa y perdí mucho tiempo. Espero que durante este período, todos puedan gastar menos o ningún tiempo y energía innecesarios durante el desarrollo.
Hubo un artículo sobre PCD que introdujo un método para acceder directamente a la intranet. De hecho, siempre que usemos la herramienta de mapeo de puertos, podemos lograr fácilmente el propósito de penetrar en la intranet. "Port Mapper" es una herramienta. Lo que vale la pena mencionar más es que elimina el modo de línea de comando y proporciona un entorno operativo de interfaz gráfica.
Para que todos entiendan más, permítanme hablar primero sobre el principio. Supongamos que ahora hay una LAN con el host A. Además del host, también hay una máquina en la LAN con B. Por supuesto, la máquina B está navegando por Internet a través del host A. También hay una máquina que puede acceder a Internet, que no está en el mismo LAN que A y B. Normalmente, la máquina C solo puede acceder al host A, pero no puede penetrar en el LAN y acceder a B. Después de que el Mapeador de Port Mappes C accesas el puerto específico A del host A, el host A, el host ", el Lin. Transferirá los datos en el puerto especificado al puerto especificado de otra máquina en la LAN, logrando así el propósito de acceder a la máquina Intranet. Diciendo de esta manera, todos lo entienden. En cuanto a cómo configurarlo, el autor cree que no debería ser una tarea difícil. Además, hay muchas explicaciones gráficas en Internet. Consulte los artículos en Internet para su configuración.
Por supuesto, las ventajas de realizar el acceso directo a la intranet son obvias. Sin mencionar nada más, al menos los recursos FTP se utilizan completamente. Sin embargo, debe recordar que el acceso directo a la intranet puede amenazar la seguridad de la intranet. El autor cree que la mayoría de los amigos aún otorgan importancia a la importancia de la seguridad del anfitrión, pero a menudo ignoran la configuración de seguridad de las máquinas intranet. Una vez que haya logrado el acceso directo a la intranet, debe tratar las máquinas de intranet como un host, de lo contrario, toda su red puede estar en peligro.
Acceder a los recursos del cliente
La política de seguridad del entorno de aplicación Java, que se expresa por un objeto de política para los permisos de diferentes recursos propiedad de diferentes códigos. Para que el applet (o una aplicación que se ejecute en SecurityManager) realice comportamientos protegidos, como leer y escribir archivos, Applet (o aplicaciones Java) debe obtener permiso para esa operación, y el archivo de política de seguridad se utiliza para implementar estos permisos.
Un objeto de política puede tener múltiples entidades, aunque solo una puede trabajar en cualquier momento. El objeto de política instalado actualmente se puede obtener en el programa llamando al método GetPolicy o cambiado llamando al método SetPolicy. El objeto de la política evalúa toda la política, devuelve un objeto de permisos apropiado que detalla qué código puede acceder a qué recursos. Los archivos de políticas se pueden almacenar en archivos ASCII sin formato o en archivos binarios o bases de datos de la clase de política. Este artículo solo discute la forma de archivos ASCII sin formato.
En uso real, no necesitamos escribir manualmente archivos java.policy tan complejos, especialmente cuando no usamos firmas digitales. En este momento, podemos aprender completamente del archivo C:/Program/Java/JRE1.5.0_12/Lib/Security/Java.policy que nos proporciona JRE, y realiza modificaciones correspondientes de acuerdo con nuestras necesidades. Este artículo escribirá un archivo de política de seguridad para la situación en la que no se utilizan firmas digitales. A continuación se muestra un archivo Java.policy completo utilizado en Windows NT/XP. En el archivo, el propósito de cada registro de "permiso" se explica por separado utilizando comentarios. Por supuesto, los diferentes programas pueden tener diferentes requisitos para los derechos de acceso a recursos, y pueden ajustarse y seleccionarse de acuerdo con las necesidades del proyecto.
otorgar {// permiso para "leer" el permiso del directorio del sistema y del usuario java.util.propertypermission "user.dir", "leer"; permiso java.util.propertypermission "user.home", "leer"; permiso java.util.propertypermission "java.home", "leer"; permiso java.util.propertypermission "java.home", "leer"; permiso java.util.propertypermission "java.class.pat", "leer"; permiso java.util.propertypermission "user.name", "leer"; // permisos de operación en los hilos y grupos de hilos permiso java.lang.runtimePermission "AccessClassInpackage.sun.misc"; Permiso java.lang.runtimePermission "AccessClassInpackage.sun.audio"; permiso java.lang.runtimePermission "ModifyThread"; permiso java.lang.runtimePermission "ModifyThreadGroup"; permiso java.lang.runtimePermission "LoadLibrary.*"; // permiso para leer y escribir archivos permiso java.io.filePermission "<< todos los archivos >>", "leer"; Permiso java.io.filePermission "$ {user.dir} $ {/} jmf.log", "Write"; Permiso java.io.filePermission "$ {user.home} $ {/}. JMStudioCfg", "Write"; permiso java.net.socketpermission "*", "conectar, aceptar"; permiso java.io.filePermission "c:/winnt/temp/*", "escribir"; permiso java.io.filePermission "c:/winnt/temp/*", "eliminar"; permiso java.awt.awtpermission "showwindowwithoutwarningbanner"; permiso javax.sound.sampled.audiopermission "registro"; // // Varios permisos para el permiso operativo de los puertos de socket Java.net.socketpermission "-", "escuchar"; permiso java.net.socketpermission "-", "aceptar"; permiso java.net.socketpermission "-", "conectar"; permiso java.net.socketpermission "-", "resolver"; Permiso Java.security. Allpermission; }; Subvención firmada "Saili" {Permiso java.net.socketpermission "*: 1024-65535", "conectar, aceptar, resolver"; permiso java.net.socketpermission "*: 80", "conectar"; Permiso java.net.socketpermission "-", "Escuchar, aceptar, conectar, escuchar, resolver", firmado por "ganja"; permiso java.net.socketpermission "-", "aceptar"; permiso java.net.socketpermission "-", "conectar"; permiso java.net.socketpermission "-", "resolver"; Permiso Java.security. Allpermission; }; En este proyecto, para que sea más conveniente y simple usar la configuración del usuario del cliente, el archivo anterior se convierte en un pequeño programa que usa VB o C#. Luego combine JRE y algunos ex en un paquete EXE. Después de instalar el JRE, este applet es responsable de encontrar la ruta de instalación de JRE en el sistema operativo y escribir el archivo Java.policy en el programa para sobrescribir el archivo original. De esta manera, el usuario solo necesita instalar un archivo EXE, que simplifica el número de operaciones de instalación.
7. Servidor de devolución de llamada del applet
La capacidad de JavaScript y Applet para comunicarse entre sí nos brinda mucha conveniencia. Java y JavaScript se complementan entre sí para desarrollar aplicaciones web más perfectas. B/S puede hacer uso completo de las ventajas de Java, brindándonos más experiencia en red y haciéndola conveniente para los usuarios. El autor utiliza más aplicaciones desarrolladas por Swing Components para implementar la arquitectura B/S usando Applet, lo que puede demostrar completamente las ventajas de los componentes Swing, facilitar las actualizaciones del sistema y mantener; Además, en Web, a veces el cliente necesita usar recursos de hardware locales. Lo que sé es que se implementa a través de Applet y llama a la API Java a través del Applet. Echemos un vistazo a cómo JavaScript y Applet se comunican en detalle.
1. Acceso a JavaScript al applet
<Applet name = "Appletname" .... /// JavaScript accede a las propiedades del applet.
Window.document.appletname.appletfield (la propiedad debe ser pública, "Window.document". También se puede escribir sin escribir) // JavaScript Access to Applet Method.
Window.document.appletname.appletMethod (el método debe ser público, "Window.document". También se puede escribir sin escribir).
2. Acceso de apropiado a JavaScript
Live Connect proporciona una interfaz entre Java y JavaScript, que permite que JavaScript se use en applets de applet Java.
Debe usar un paquete JAR y buscarlo en el directorio C:/Program/Java/. Son alrededor de 5 m. De hecho, es solo para abrirlo para ver cuál tiene netscape.javascript.jsobject. Si no tiene Netscape instalado o puede hacerlo en línea o fuera de línea. Puede cambiar el nombre de Netscape.jar (no necesario), y debe agregarse a ClassPath, con el propósito de hacerlo compilado durante el desarrollo. Es particularmente importante tener en cuenta que no se requiere que Netscape.jar se incluya durante la implementación, porque todo el paquete se descargará al cliente, afectando la velocidad.
// Introducir la clase Netscape import netscape.javaScript.jsobject; import netscape.javascript.jsexception; // Se puede permitir manejar eventos de excepción en applets public void callJavaScript (String CallbackBaBJavaScript) {JSObject Window = JSObject.getWindow (this); // Obtenga el mango de la ventana JavaScript y consulte la ventana del documento actual JSObject Document = (JSObject) Window.getMember ("Documento"); form = (jsobject) doc.getMember ("textform"); // Acceda al objeto de formulario JavaScript textfield = (jsobject) form.getMember ("TextField"); Acceda al objeto de texto JavaScript text = (string) textfield.getMember ("valor"); // Obtenga el valor del área de texto // llame al método alert () de JavaScript // window.eval ("alerta (/" Esta alerta proviene de Java!/")"); Window.call (CallbackJavaScript, NULL); // Los parámetros se representan en forma de una matriz. }8. Efecto de operación
1. Subir
(1). Iniciar la carga
(2). Carga
(3). Carga
(4). Subir con éxito
2. Descargar
(1) Guardar ruta del archivo de descarga
(2) Descargar
(3) descarga
(4) Descargue con éxito
9. Resumen
En este artículo, el autor explicará la solución al problema de carga y descarga en proyectos reales, y usará el protocolo FTP para lograr un lote, la carga y descarga de archivos grandes básicos. Al mismo tiempo, puede acceder a los recursos locales en el cliente a través de la tecnología de applet. Se realizó una discusión preliminar sobre algunas de las funciones reales que las personas a menudo se encuentran, como la barra de progreso, la transmisión continua del punto de interrupción, la asignación de red interna y externa FTP, etc. Esta es la aplicación básica del autor basada en algunas bibliotecas de clientes Java FTP. Espero que sea una referencia para los lectores. Suplementar algunos de estos asuntos inacabados. También hay algunos contenidos que son relativamente fáciles y tienen descripciones o ejemplos en línea que no figuran aquí. Por ejemplo, cómo FTP puede establecer servicios FTP en el software Serv-U del lado del servidor, cómo los applets están integrados en las páginas JSP y los métodos de entrega de parámetros, y cómo se inician los applets en Eclipse o NetBeans, debido a limitaciones de espacio, no hay una descripción detallada. Consulte los ejemplos u otros materiales de referencia en Internet.
Descargar dirección: http://xiazai.vevb.com/201608/yuanma/ftptransfer(vevb.com).rar
Nota: Teniendo en cuenta el problema de los derechos de autor, el archivo de clase Java no fue enviado, pero creo que todos ya están familiarizados con cómo restaurar dicho archivo JAR a un archivo Java, jaja.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.