The example in this article describes the method of copying files between two servers in Java. Share it with everyone for your reference. The specific analysis is as follows:
Usually the file copy function we use most is the file copy function between the same servers. What is introduced here is the functional upgrade of ordinary file copy, which can realize the copy of files between two servers. Let's take a look at the code.
1. Server side
Copy the code as follows: package sterning;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTest {
int port = 8821;
void start() {
Socket s = null;
try {
ServerSocket ss = new ServerSocket(port);
while (true) {
//Select files for transfer
String filePath = "D://lib.rar";
File fi = new File(filePath);
System.out.println("File length:" + (int) fi.length());
// public Socket accept() throws
// IOException listens for and accepts connections to this socket. This method blocks until a connection is made.
s = ss.accept();
System.out.println("Establish socket connection");
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());
//Transmit the file name and length to the client. To be truly applicable to all platforms, processing of Chinese names, for example, still requires processing. For details, please refer to the ready-made code in Think In Java 4th.
ps.writeUTF(fi.getName());
ps.flush();
ps.writeLong((long) fi.length());
ps.flush();
int bufferSize = 8192;
byte[] buf = new byte[bufferSize];
while (true) {
int read = 0;
if (fis != null) {
read = fis.read(buf);
}
if (read == -1) {
break;
}
ps.write(buf, 0, read);
}
ps.flush();
// Be careful to close the socket link, otherwise the client will wait for data from the server.
// Until the socket times out, resulting in incomplete data.
fis.close();
s.close();
System.out.println("File transfer completed");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String arg[]) {
new ServerTest().start();
}
}
2. Util auxiliary class of socket
Copy the code as follows: package sterning;
import java.net.*;
import java.io.*;
public class ClientSocket {
private String ip;
private int port;
private Socket socket = null;
DataOutputStream out = null;
DataInputStream getMessageStream = null;
public ClientSocket(String ip, int port) {
this.ip = ip;
this.port = port;
}
/** *//**
* Create socket connection
*
* @throwsException
* exception
*/
public void CreateConnection() throws Exception {
try {
socket = new Socket(ip, port);
} catch (Exception e) {
e.printStackTrace();
if (socket != null)
socket.close();
throw e;
} finally {
}
}
public void sendMessage(String sendMessage) throws Exception {
try {
out = new DataOutputStream(socket.getOutputStream());
if (sendMessage.equals("Windows")) {
out.writeByte(0x1);
out.flush();
return;
}
if (sendMessage.equals("Unix")) {
out.writeByte(0x2);
out.flush();
return;
}
if (sendMessage.equals("Linux")) {
out.writeByte(0x3);
out.flush();
} else {
out.writeUTF(sendMessage);
out.flush();
}
} catch (Exception e) {
e.printStackTrace();
if (out != null)
out.close();
throw e;
} finally {
}
}
public DataInputStream getMessageStream() throws Exception {
try {
getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
return getMessageStream;
} catch (Exception e) {
e.printStackTrace();
if (getMessageStream != null)
getMessageStream.close();
throw e;
} finally {
}
}
public void shutDownConnection() {
try {
if (out != null)
out.close();
if (getMessageStream != null)
getMessageStream.close();
if (socket != null)
socket.close();
} catch (Exception e) {
}
}
}
3.Client
Copy the code as follows: package sterning;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
public class ClientTest {
private ClientSocket cs = null;
private String ip = "localhost";//Set to server IP private int port = 8821;
private String sendMessage = "Windwos";
public ClientTest() {
try {
if (createConnection()) {
sendMessage();
getMessage();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private boolean createConnection() {
cs = new ClientSocket(ip, port);
try {
cs.CreateConnection();
System.out.print("Connection to server successful!" + "/n");
return true;
} catch (Exception e) {
System.out.print("Failed to connect to server!" + "/n");
return false;
}
}
private void sendMessage() {
if (cs == null)
return;
try {
cs.sendMessage(sendMessage);
} catch (Exception e) {
System.out.print("Failed to send message!" + "/n");
}
}
private void getMessage() {
if (cs == null)
return;
DataInputStream inputStream = null;
try {
inputStream = cs.getMessageStream();
} catch (Exception e) {
System.out.print("receiving message cache error/n");
return;
}
try {
//Local save path, the file name will be automatically inherited from the server.
String savePath = "E://";
int bufferSize = 8192;
byte[] buf = new byte[bufferSize];
int passedlen = 0;
longlen=0;
savePath += inputStream.readUTF();
DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))));
len = inputStream.readLong();
System.out.println("The length of the file is:" + len + "/n");
System.out.println("Start receiving files!" + "/n");
while (true) {
int read = 0;
if (inputStream != null) {
read = inputStream.read(buf);
}
passedlen += read;
if (read == -1) {
break;
}
//The progress bar below is originally made for the prograssBar of the graphical interface. If you are printing a file here, some of the same percentages may be printed repeatedly.
System.out.println("File received" + (passedlen * 100/ len) + "%/n");
fileOut.write(buf, 0, read);
}
System.out.println("Reception completed, file saved as" + savePath + "/n");
fileOut.close();
} catch (Exception e) {
System.out.println("Error in receiving message" + "/n");
return;
}
}
public static void main(String arg[]) {
new ClientTest();
}
}
I hope this article will be helpful to everyone’s Java programming.