Em seguida, o artigo anterior será enviado e baixado.
5. retomar o ponto de interrupção
Para programadores familiarizados com o QQ, a função de transmissão contínua do Ponto de interrupção do QQ deve ser muito impressionante. Porque é muito prático e aspecto. Portanto, durante nosso processo de upload e download, a função da transmissão contínua do ponto de interrupção é muito bem implementada.
De fato, o princípio da transmissão contínua do ponto de interrupção é muito simples. Durante o processo de upload, vá para o serviço para descobrir se esse arquivo existe. Se houver alguns arquivos, compare o tamanho do arquivo no servidor com o tamanho do arquivo local. Se os arquivos no servidor forem menores que o local, acredita -se que a transmissão contínua do ponto de interrupção seja possível durante o processo de upload deste arquivo.
Durante a implementação, a classe RandomAccessFile se torna útil. Instâncias desta classe Suporte a leitura e gravação em arquivos de acesso aleatório. Os arquivos de acesso aleatório se comportam como uma grande matriz de bytes armazenada no sistema de arquivos. Há um cursor ou índice apontando para a matriz implícita, chamada de ponteiro de arquivo; A operação de entrada lê bytes do ponteiro do arquivo e avança o ponteiro do arquivo à medida que o byte é lido. Se o arquivo de acesso aleatório for criado no modo de leitura/gravação, a operação de saída também estará disponível; A operação de saída começa com o ponteiro do arquivo e avança o ponteiro do arquivo à medida que o byte é gravado. Uma operação de saída depois de escrever no final atual de uma matriz implícita faz com que a matriz se expanda. O ponteiro do arquivo pode ser lido através do método getFilePointer e definido através do método Seek.
O método skipbytes da classe RandomAccessFile tenta pular a entrada de bytes para descartar os bytes ignorados. Se você encontrar o tamanho n do arquivo a ser carregado no servidor, poderá usar o método Skipbytes para pular esses n bytes e começar a executar a transmissão contínua do ponto de interrupção de um novo local. Para métodos específicos, consulte a descrição da API do JDK5.
Você pode ver a implementação do upload e download de transmissão contínua de ponto de interrupção no método de execução da classe Dataconnection. O código é o seguinte:
public void run () {try {newline = con.getCrlf (); if (Settings.getftppasvmode ()) {try {Sock = new Socket (host, porta); Sock.SetSotimeout (Settings.getSockettimeout ()); } catch (exceção ex) {ok = false; Debug ("Não é possível abrir soquete na porta" + porta); }} else {//log.debug("Trying novo soquete do servidor: "+porta); tente {ssock = new ServerSocket (porta); } catch (exceção ex) {ok = false; Log.debug ("Não é possível abrir o ServerSocket na porta" + porta); }}} catch (Exceção ex) {debug (ex.toString ()); } isthere = true; booleano ok = true; RandomAccessFile fout = nulo; BufferOutputStream luta = null; RandomAccessFile Fin = NULL; tente {if (! Settings.getftppasvmode ()) {int retry = 0; while ((tente ++ <5) && (sok == null)) {try {ssock.seSToTimeout (Settings.ConnectionTimeout); SOCK = ssock.accept (); } catch (ioexception e) {Sock = null; Debug ("Obteve a ioexception enquanto tenta abrir um soquete!"); if (retratar == 5) {Debug ("A conexão falhou, tentou 5 vezes - talvez tente um tempo limite mais alto em Settings.java"); } acabado = true; jogar e; } finalmente {ssock.close (); } debug ("Tentativa de tempo exagerado, novamente novamente"); }} if (ok) {byte [] buf = new Byte [Settings.Buffersize]; start = system.currenttimemillis (); int buflen = 0; // --------------- Download , 下载 ---------------------- if (type.equals (get) || type.equals (getdir)) {if (! justStream) {try {if (retume) {arquivo f = new File (arquivo); fout = new RandomAccessFile (arquivo, "rw"); fout.skipbytes ((int) f.Length ()); buflen = (int) f.Length (); } else {if (localfile == null) {localfile = file; } Arquivo f2 = novo arquivo (Settings.apphomedir); f2.mkdirs (); Arquivo f = novo arquivo (LocalFile); if (f.Exists ()) {f.Delete (); } bout = new BufferoudOutputStream (new FileOutputStream (LocalFile), Settings.Buffersize); }} Catch (Exceção ex) {Debug ("Não é possível criar saída de saída:" + arquivo); ok = false; Ex.PrintStackTrace (); }} // --------------- upload , 上传 ------------------------ if (type.equals (put) || type.equals (putdir)) {if (in == null) {tente {fin = new RandomAccessFile (arquivo, "r"); if (retomar) {fin.skipbytes (skiplen); } // fin = new bufferInputStream (new FileInputStream (arquivo)); } catch (Exceção ex) {Debug ("Não é possível abrir o InputFile:" + "(" + ex + ")"); ok = false; }} if (ok) {try {out = new BufferoudOutputStream (sock.getOutputStream ()); } catch (exceção ex) {ok = false; Debug ("Não é possível obter saída"); } 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 += leia; //System.out.println(File + "" + type + "" + len + "" + leia); if (read == -1) {break; } if (newline! = null) {byte [] buf2 = modifyput (buf, leia); out.write (buf2, 0, buf2.Length); } else {out.write (buf, 0, leia); } Con.FireProgressUpdate (arquivo, tipo, len); if (time ()) {// log.debugsize (len, false, false, arquivo); } if (read == streamTokenizer.tt_eof) {break; }} out.flush (); //Log.debugsize(len, false, true, arquivo); } catch (ioexception ex) {ok = false; Debug ("Erro: conexão de dados fechada."); Con.FireProgressUpdate (arquivo, falhou, -1); Ex.PrintStackTrace (); }}}}}}} catch (ioexception ex) {log.debug ("Não é possível conectar o soquete ao serviderSocket"); Ex.PrintStackTrace (); } finalmente {tente {if (out! = null) {out.flush (); out.Close (); }} catch (Exceção ex) {ex.PrintStackTrace (); } tente {if (bout! = null) {bout.flush (); bout.close (); }} catch (Exceção ex) {ex.PrintStackTrace (); } tente {if (fout! = null) {fout.close (); }} catch (Exceção ex) {ex.PrintStackTrace (); } tente {if (in! = null &&! justStream) {in.close (); } if (fin! = null) {fin.close (); }} catch (Exceção ex) {ex.PrintStackTrace (); }} tente {sock.close (); } catch (Exceção ex) {debug (ex.ToString ()); } if (! Settings.getftppasvmode ()) {try {ssock.close (); } catch (Exceção ex) {debug (ex.ToString ()); }} acabado = true; if (ok) {con.fireProgressUpDate (arquivo, finalizado, -1); } else {Con.FireProgressUpdate (arquivo, falhou, -1); }} 6. Mapeamento de porta FTP
Existem dois tipos de conexões de dados FTP: PASV e PORT. Se o seu servidor FTP estiver localizado na intranet, você precisará usar o mapeamento da porta. No começo, eu não sabia muito sobre o mapeamento de rede externo da FTP, então comecei a fazer muitos desvios. No começo, eu sempre pensei que havia algo errado com meu programa e desperdiçava muito tempo. Espero que, durante esse período, todos possam gastar menos ou nenhum tempo e energia desnecessários durante o desenvolvimento.
Houve um artigo sobre PCD que introduziu um método para acessar diretamente a intranet. De fato, enquanto usamos a ferramenta de mapeamento de porta, podemos facilmente alcançar o objetivo de penetrar na intranet. "Port Mapper" é uma ferramenta. O que vale a pena mencionar é que ele se livra do modo de linha de comando e fornece um ambiente operacional de interface gráfica.
Para fazer você entender mais, deixe -me falar sobre o princípio primeiro. Suponha que agora exista uma LAN com o host A. Além do host, também existe uma máquina na LAN com B., é claro, a máquina B está navegando na Internet através do Host A. Também existe uma máquina que pode acessar a Internet, que não está na mesma LAN e a porta e B. Normalmente, a máquina C. funciona. Ele transferirá os dados na porta especificada para a porta especificada de outra máquina na LAN, alcançando assim o objetivo de acessar a máquina da intranet. Dizendo dessa maneira, todo mundo entende. Quanto a como configurá -lo, o autor acredita que não deve ser uma tarefa difícil. Além disso, existem muitas explicações gráficas na Internet. Consulte os artigos na Internet para configurar.
Obviamente, as vantagens de realizar o acesso direto à intranet são óbvias. Sem mencionar mais nada, pelo menos os recursos FTP são totalmente utilizados. No entanto, deve -se lembrar que o acesso direto à intranet pode ameaçar a segurança da intranet. O autor acredita que a maioria dos amigos ainda atribui importância à importância da segurança do host, mas geralmente ignora as configurações de segurança das máquinas da intranet. Depois de obter acesso direto à intranet, você deve tratar as máquinas da intranet como um host, caso contrário, toda a sua rede poderá estar em perigo.
Acesse os recursos do cliente
A política de segurança do ambiente de aplicativos Java, que é expressa por um objeto de política para as permissões de diferentes recursos pertencentes a diferentes códigos. Para que o Applet (ou um aplicativo em execução no SecurityManager) realize comportamentos protegidos, como leitura e gravação de arquivos, applet (ou aplicativos Java) devem obter permissão para essa operação e o arquivo de política de segurança é usado para implementar essas permissões.
Um objeto de política pode ter várias entidades, embora apenas se possa funcionar a qualquer momento. O objeto de política atualmente instalado pode ser obtido no programa chamando o método getPolicy ou alterado chamando o método setPolicy. O objeto de política avalia toda a política, retornando um objeto de permissões apropriado que detalha qual código pode acessar quais recursos. Os arquivos de política podem ser armazenados em arquivos ASCII não formatados ou em arquivos binários ou bancos de dados da classe de política. Este artigo discute apenas a forma de arquivos ASCII não formatados.
No uso real, não precisamos escrever manualmente arquivos java.policy tão complexos, especialmente quando não usamos assinaturas digitais. No momento, podemos aprender completamente com os arquivos C:/programas prontos/java/jre1.5.0_12/lib/security/java.policy File fornecido a nós por JRE e fazer modificações correspondentes de acordo com nossas necessidades. Este artigo escreverá um arquivo de política de segurança para a situação em que as assinaturas digitais não são usadas. Abaixo está um arquivo Java.Policy completo usado no Windows NT/XP. No arquivo, o objetivo de cada registro de "permissão" é explicado separadamente usando comentários. Obviamente, diferentes programas podem ter requisitos diferentes para direitos de acesso a recursos e podem ser ajustados e selecionados de acordo com as necessidades do projeto.
concessão {// permissão para "ler" o sistema e a permissão do diretório do usuário java.util.propertypermission "user.dir", "leia"; permissão java.util.propertypermission "user.home", "leia"; permissão java.util.propertypermission "java.home", "leia"; permissão java.util.propertypermission "java.home", "leia"; permissão java.util.propertypermission "java.class.pat", "leia"; permissão java.util.propertypermission "user.name", "leia"; // permissões de operação em threads e grupos de threads permissão java.lang.runtimePermission "accessClassinpackage.sun.misc"; permissão java.lang.runtimePermission "accessClassinpackage.sun.audio"; permissão java.lang.RuntimePermission "ModifyThread"; permissão java.lang.runtimePermission "modifythreadgroup"; permissão java.lang.runtimePermission "Loadlibrary.*"; // permissão para ler e gravar arquivos permissão java.io.filepermission "<< Todos os arquivos >>", "Leia"; permissão java.io.filepermission "$ {user.dir} $ {/} jmf.log", "write"; permissão java.io.filepermission "$ {user.home} $ {/}. jmstudiocfg", "write"; permissão java.net.socketpermission "*", "conectar, aceitar"; permissão java.io.filepermission "c:/winnt/temp/*", "write"; permissão java.io.filepermission "c:/winnt/temp/*", "delete"; permissão java.awt.awtpermission "ShowWindowwithoutwarningbanner"; permissão javax.sound.sampled.audiopermission "registro"; // // várias permissões para operações de portas de soquete permissão java.net.socketpermission "-", "escute"; permissão java.net.socketpermission "-", "aceitar"; permissão java.net.socketpermission "-", "Connect"; permissão java.net.socketpermission "-", "resolve"; permissão java.security.allpermission; }; Grant assinado "Saili" {permissão java.net.socketpermission "*: 1024-65535", "Connect, aceite, resolve"; permissão java.net.socketpermission "*: 80", "Connect"; permissão java.net.socketpermission "-", "Ouça, aceite, conecte, ouça, resolva", assinado "ganja"; permissão java.net.socketpermission "-", "aceitar"; permissão java.net.socketpermission "-", "Connect"; permissão java.net.socketpermission "-", "resolve"; permissão java.security.allpermission; }; Neste projeto, para torná -lo mais conveniente e simples de usar as configurações do usuário do cliente, o arquivo acima é transformado em um pequeno programa usando VB ou C#. Em seguida, misture o JRE e alguns ex em um pacote exe. Após a instalação do JRE, este applet é responsável por encontrar o caminho de instalação do JRE no sistema operacional e escrever o arquivo java.policy no programa para substituir o arquivo original. Dessa forma, o usuário precisa instalar apenas um arquivo exe, que simplifica o número de operações de instalação.
7. Servidor de retorno de chamada de applet
A capacidade do JavaScript e do Applet se comunicará nos traz muita conveniência. Java e JavaScript se complementam para desenvolver aplicativos da Web mais perfeitos. O B/S pode fazer pleno uso das vantagens do Java, trazendo -nos mais experiência em rede e tornando -o conveniente para os usuários. O autor usa mais aplicativos desenvolvidos por componentes de giro para implementar a arquitetura B/S usando o applet, que pode demonstrar completamente as vantagens dos componentes de swing, facilitar as atualizações e manutenção do sistema; Além disso, na Web, às vezes o cliente precisa usar recursos de hardware locais. O que eu sei é que ele é implementado através do applet e chama a API Java através do applet. Vamos dar uma olhada em como o JavaScript e o applet se comunicam em detalhes?
1. Javascript Acesso ao applet
<Applet name = "AppletName" .... /// javascript acessa propriedades de applet.
window.document.appletName.appletfield (a propriedade deve ser pública, "window.document". também pode ser escrito sem escrever) // Javascript Acesso ao método do applet.
window.document.appletName.appletMethod (o método deve ser público, "window.document". Também pode ser escrito sem escrever).
2. APELA ACESSO AO JAVASCRIPT
O Live Connect fornece uma interface entre Java e JavaScript, que permite que o JavaScript seja usado nos Applet Applets Java.
Você precisa usar um pacote de jar e procurá -lo nos arquivos c:/programas/java/diretório. São cerca de 5m. De fato, é apenas para abri -lo para ver qual deles possui Netscape.javascript.jSobject. Se você não tiver o Netscape instalado ou pode fazê -lo on -line ou offline. Você pode renomeá -lo para Netscape.jar (não necessário) e deve ser adicionado ao ClassPath, com o objetivo de fazê -lo compilado durante o desenvolvimento. É particularmente importante observar que o Netscape.jar não precisa ser incluído durante a implantação, porque o pacote inteiro será baixado para o cliente, afetando a velocidade.
// Introduce a classe Netscape importar Netscape.javascript.jSobject; importar netscape.javascript.jsexception; // Pode ser permitido lidar com eventos de exceção em applets public void calljavascript (string callbackjavascript) {jsobject window = jsobject.getwindow (this); // Obtenha a alça da janela JavaScript e consulte a janela atual do documento JSOBject Document = (JSOBject) Window.getMember ("Document"); form = (JSObject) doc.getMember ("textform"); // Acesse o formulário JavaScript objeto textfield = (JSobject) form.getMember ("textfield"); Acesse o texto Javascript Text Object Text = (String) textfield.getMember ("Value"); // obtém o valor da área de texto // Ligue para o javascript's alert () métod // window.eval ("alerta (/" Este alerta vem de java!/")"); window.call (chamado de chamadas, nulo); // Os parâmetros são representados na forma de uma matriz. }8. Efeito de operação
1. Carregar
(1). Inicie o upload
(2). Upload
(3). Upload
(4). Carregar com sucesso
2. Download
(1) Salvar o caminho do arquivo de download
(2) Download
(3) Download
(4) Download com sucesso
9. Resumo
Neste artigo, o autor explicará a solução para o problema de upload e download em projetos reais e usará o protocolo FTP para obter lote, os arquivos grandes básicos da Web carregam e baixam. Ao mesmo tempo, pode acessar recursos locais no cliente através da tecnologia Applet. Uma discussão preliminar foi realizada sobre algumas das funções reais que as pessoas costumam encontrar, como a barra de progresso, a transmissão contínua do ponto de interrupção, o mapeamento de rede interno e externo FTP, etc. Este é o aplicativo básico do autor com base em algumas bibliotecas de clientes Java FTP. Espero que seja uma referência para os leitores. Complementar alguns desses assuntos inacabados. Existem também alguns conteúdos relativamente fáceis e têm descrições ou exemplos on -line que não estão listados aqui. Por exemplo, como o FTP pode estabelecer serviços FTP no software Serv-U do lado do servidor, como os applets são incorporados nas páginas JSP e nos métodos de entrega de parâmetros e como os applets são iniciados em Eclipse ou NetBeans, devido a limitações de espaço, não há descrição detalhada. Consulte os exemplos ou outros materiais de referência na Internet.
Endereço para download: http://xiazai.vevb.com/201608/yuanma/ftptransfer(vevb.com).rar
Nota: Considerando o problema dos direitos autorais, o arquivo da classe Java não foi enviado, mas acho que todo mundo já está familiarizado com a restauração de um arquivo jar em um arquivo java, haha.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.