O exemplo neste artigo descreve o método de cópia de arquivos entre dois servidores em Java. Compartilhe com todos para sua referência. A análise específica é a seguinte:
Normalmente, a função de cópia de arquivo que mais usamos é a função de cópia de arquivo entre os mesmos servidores. O que é apresentado aqui é a atualização funcional da cópia de arquivo comum, que pode realizar a cópia de arquivos entre dois servidores.
1. Lado do servidor
Copie o código da seguinte forma: package sterning;
importar java.io.BufferedInputStream;
importar java.io.DataInputStream;
importar java.io.DataOutputStream;
importar java.io.File;
importar java.io.FileInputStream;
importar java.net.ServerSocket;
importar java.net.Socket;
classe pública ServerTest {
porta interna = 8821;
void início() {
Soquete s = nulo;
tentar {
ServerSocket ss = novo ServerSocket(porta);
enquanto (verdadeiro) {
//Seleciona os arquivos para transferência
String filePath = "D://lib.rar";
Arquivo fi = novo arquivo(filePath);
System.out.println("Comprimento do arquivo:" + (int) fi.length());
// Soquete público aceita() lança
// IOException escuta e aceita conexões com este soquete. Este método é bloqueado até que uma conexão seja feita.
s = ss.accept();
System.out.println("Estabelecer conexão de soquete");
DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));
dis.readByte();
DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
DataOutputStream ps = new DataOutputStream(s.getOutputStream());
//Transmite o nome e comprimento do arquivo para o cliente. Para ser verdadeiramente aplicável a todas as plataformas, o processamento de nomes chineses, por exemplo, ainda requer processamento. Para obter detalhes, consulte o código pronto em Think In Java 4th.
ps.writeUTF(fi.getName());
ps.flush();
ps.writeLong((long) fi.length());
ps.flush();
int bufferSize = 8192;
byte[] buf = novo byte[bufferSize];
enquanto (verdadeiro) {
leitura interna = 0;
if (fis! = nulo) {
ler = fis.ler(buf);
}
if (ler == -1) {
quebrar;
}
ps.write(buf, 0, leitura);
}
ps.flush();
// Tenha cuidado ao fechar o link do soquete, caso contrário o cliente irá aguardar os dados do servidor.
// Até que o soquete expire, resultando em dados incompletos.
fis.close();
s.close();
System.out.println("Transferência de arquivo concluída");
}
} catch (Exceção e) {
e.printStackTrace();
}
}
public static void main(String arg[]) {
novo ServerTest().start();
}
}
2. Util classe auxiliar de soquete
Copie o código da seguinte forma: package sterning;
importar java.net.*;
importar java.io.*;
classe pública ClientSocket {
string privada ip;
porta interna privada;
soquete privado soquete = null;
DataOutputStream out = null;
DataInputStream getMessageStream = null;
public ClientSocket(String ip, porta interna) {
este.ip = ip;
esta.porta = porta;
}
/** *//**
* Criar conexão de soquete
*
* @throwsException
* exceção
*/
public void CreateConnection() lança exceção {
tentar {
soquete = novo Soquete(ip, porta);
} catch (Exceção e) {
e.printStackTrace();
if (soquete! = nulo)
soquete.close();
jogue e;
} finalmente {
}
}
public void sendMessage(String sendMessage) lança exceção {
tentar {
saída = novo DataOutputStream(socket.getOutputStream());
if (sendMessage.equals("Windows")) {
out.writeByte(0x1);
fora.flush();
retornar;
}
if (sendMessage.equals("Unix")) {
out.writeByte(0x2);
fora.flush();
retornar;
}
if (sendMessage.equals("Linux")) {
out.writeByte(0x3);
fora.flush();
} outro {
out.writeUTF(enviarMensagem);
fora.flush();
}
} catch (Exceção e) {
e.printStackTrace();
if (fora! = nulo)
out.close();
jogue e;
} finalmente {
}
}
public DataInputStream getMessageStream() lança exceção {
tentar {
getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
retornar getMessageStream;
} catch (Exceção e) {
e.printStackTrace();
if (getMessageStream! = nulo)
getMessageStream.close();
jogue e;
} finalmente {
}
}
public void shutDownConnection() {
tentar {
if (fora! = nulo)
out.close();
if (getMessageStream! = nulo)
getMessageStream.close();
if (soquete! = nulo)
soquete.close();
} catch (Exceção e) {
}
}
}
3.Cliente
Copie o código da seguinte forma: package sterning;
importar java.io.BufferedOutputStream;
importar java.io.DataInputStream;
importar java.io.DataOutputStream;
importar java.io.FileOutputStream;
classe pública ClienteTeste {
clienteSocket privado cs = null;
private String ip = "localhost";//Definir como IP do servidor private int port = 8821;
private String sendMessage = "Windwos";
public ClienteTeste() {
tentar {
if (criarConexão()) {
enviarMensagem();
getMessage();
}
} catch (Exceção ex) {
ex.printStackTrace();
}
}
private boolean createConnection() {
cs = novo ClientSocket(ip, porta);
tentar {
cs.CreateConnection();
System.out.print("Conexão ao servidor bem-sucedida!" + "/n");
retornar verdadeiro;
} catch (Exceção e) {
System.out.print("Falha ao conectar ao servidor!" + "/n");
retornar falso;
}
}
private void sendMessage() {
se (cs == nulo)
retornar;
tentar {
cs.sendMessage(enviarMensagem);
} catch (Exceção e) {
System.out.print("Falha ao enviar mensagem!" + "/n");
}
}
private void getMessage() {
se (cs == nulo)
retornar;
DataInputStream inputStream = null;
tentar {
inputStream = cs.getMessageStream();
} catch (Exceção e) {
System.out.print("recebendo erro de cache de mensagem/n");
retornar;
}
tentar {
//Caminho de salvamento local, o nome do arquivo será herdado automaticamente do servidor.
String savePath = "E://";
int bufferSize = 8192;
byte[] buf = novo byte[bufferSize];
int passadolen = 0;
longo=0;
savePath += inputStream.readUTF();
DataOutputStream fileOut = novo DataOutputStream(novo BufferedOutputStream(novo BufferedOutputStream(novo FileOutputStream(savePath))));
len = inputStream.readLong();
System.out.println("O comprimento do arquivo é:" + len + "/n");
System.out.println("Comece a receber arquivos!" + "/n");
enquanto (verdadeiro) {
leitura interna = 0;
if (inputStream! = nulo) {
ler = inputStream.read(buf);
}
passadolen += lido;
if (ler == -1) {
quebrar;
}
//A barra de progresso abaixo é originalmente feita para o prograssBar da interface gráfica. Se você estiver imprimindo um arquivo aqui, algumas das mesmas porcentagens poderão ser impressas repetidamente.
System.out.println("Arquivo recebido" + (passedlen * 100/ len) + "%/n");
arquivoOut.write(buf, 0, leitura);
}
System.out.println("Recepção concluída, arquivo salvo como" + savePath + "/n");
arquivoOut.close();
} catch (Exceção e) {
System.out.println("Erro ao receber mensagem" + "/n");
retornar;
}
}
public static void main(String arg[]) {
newClienteTeste();
}
}
Espero que este artigo seja útil para a programação Java de todos.