이 기사의 예에서는 Java의 두 서버 간에 파일을 복사하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
일반적으로 우리가 가장 많이 사용하는 파일 복사 기능은 동일한 서버 간 파일 복사 기능인데, 여기서 소개하는 것은 두 서버 간 파일 복사를 실현할 수 있는 일반 파일 복사의 기능 업그레이드입니다.
1. 서버측
다음과 같이 코드를 복사합니다. package sterning;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
java.io.파일 가져오기;
import java.io.FileInputStream;
java.net.ServerSocket 가져오기;
java.net.Socket 가져오기;
공개 클래스 ServerTest {
int 포트 = 8821;
무효 시작() {
소켓 s = null;
노력하다 {
ServerSocket ss = 새 ServerSocket(포트);
동안 (참) {
//전송할 파일 선택
문자열 파일 경로 = "D://lib.rar";
파일 fi = new File(filePath);
System.out.println("파일 길이:" + (int) fi.length());
// 공개 소켓 accept()가 발생합니다.
// IOException은 이 소켓에 대한 연결을 수신하고 수락합니다. 이 메서드는 연결이 이루어질 때까지 차단됩니다.
s = ss.accept();
System.out.println("소켓 연결 설정");
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());
//파일 이름과 길이를 클라이언트에 전송합니다. 모든 플랫폼에 실제로 적용하려면 중국어 이름 등의 처리가 여전히 필요합니다. 자세한 내용은 Think In Java 4th의 기성 코드를 참조하세요.
ps.writeUTF(fi.getName());
ps.flush();
ps.writeLong((long) fi.length());
ps.flush();
int bufferSize = 8192;
byte[] buf = 새 바이트[bufferSize];
동안 (참) {
int 읽기 = 0;
if (fis != null) {
읽기 = fis.read(buf);
}
if (읽기 == -1) {
부서지다;
}
ps.write(buf, 0, 읽기);
}
ps.flush();
// 소켓 링크를 닫을 때 주의하세요. 그렇지 않으면 클라이언트가 서버로부터 데이터를 기다리게 됩니다.
// 소켓 시간이 초과되어 데이터가 불완전해질 때까지.
fis.close();
s.닫기();
System.out.println("파일 전송 완료");
}
} 잡기(예외 e) {
e.printStackTrace();
}
}
공개 정적 무효 메인(문자열 인수[]) {
새로운 ServerTest().start();
}
}
2. 소켓의 보조 클래스 활용
다음과 같이 코드를 복사합니다. package sterning;
java.net.* 가져오기;
import java.io.*;
공개 클래스 ClientSocket {
개인 문자열 IP;
개인용 정수 포트;
개인 소켓 소켓 = null;
DataOutputStream 출력 = null;
DataInputStream getMessageStream = null;
공개 ClientSocket(문자열 ip, int 포트) {
this.ip = 아이피;
this.port = 포트;
}
/** *//**
* 소켓 연결 생성
*
* @throwsException
* 예외
*/
public void CreateConnection()이 예외를 발생시킵니다.
노력하다 {
소켓 = 새 소켓(ip, 포트);
} 잡기(예외 e) {
e.printStackTrace();
if (소켓 != null)
소켓.닫기();
전자를 던져;
} 마지막으로 {
}
}
public void sendMessage(String sendMessage)에서 예외가 발생합니다.
노력하다 {
out = new DataOutputStream(socket.getOutputStream());
if (sendMessage.equals("Windows")) {
out.writeByte(0x1);
out.flush();
반품;
}
if (sendMessage.equals("Unix")) {
out.writeByte(0x2);
out.flush();
반품;
}
if (sendMessage.equals("Linux")) {
out.writeByte(0x3);
out.flush();
} 또 다른 {
out.writeUTF(sendMessage);
out.flush();
}
} 잡기(예외 e) {
e.printStackTrace();
if (out != null)
종료.닫기();
전자를 던져;
} 마지막으로 {
}
}
public DataInputStream getMessageStream()이 예외를 발생시킵니다.
노력하다 {
getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
getMessageStream을 반환합니다.
} 잡기(예외 e) {
e.printStackTrace();
if (getMessageStream != null)
getMessageStream.close();
전자를 던져;
} 마지막으로 {
}
}
공공 무효 shutdownDownConnection() {
노력하다 {
if (out != null)
종료.닫기();
if (getMessageStream != null)
getMessageStream.close();
if (소켓 != null)
소켓.닫기();
} 잡기(예외 e) {
}
}
}
3.클라이언트
다음과 같이 코드를 복사합니다. package sterning;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
공개 클래스 ClientTest {
개인 ClientSocket cs = null;
private String ip = "localhost";//서버 IP로 설정 private int port = 8821;
개인 문자열 sendMessage = "Windwos";
공개 클라이언트테스트() {
노력하다 {
if (createConnection()) {
sendMessage();
getMessage();
}
} catch (예외예외) {
ex.printStackTrace();
}
}
개인 부울 createConnection() {
cs = new ClientSocket(ip, 포트);
노력하다 {
cs.CreateConnection();
System.out.print("서버 연결 성공!" + "/n");
사실을 반환;
} 잡기(예외 e) {
System.out.print("서버 연결에 실패했습니다!" + "/n");
거짓을 반환;
}
}
개인 무효 sendMessage() {
if (cs == null)
반품;
노력하다 {
cs.sendMessage(sendMessage);
} 잡기(예외 e) {
System.out.print("메시지 전송에 실패했습니다!" + "/n");
}
}
개인 무효 getMessage() {
if (cs == null)
반품;
DataInputStream inputStream = null;
노력하다 {
inputStream = cs.getMessageStream();
} 잡기(예외 e) {
System.out.print("수신 메시지 캐시 오류/n");
반품;
}
노력하다 {
//로컬 저장 경로, 파일 이름은 서버에서 자동으로 상속됩니다.
문자열 savePath = "E://";
int bufferSize = 8192;
byte[] buf = 새 바이트[bufferSize];
int passlen = 0;
롱렌=0;
savePath += inputStream.readUTF();
DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))));
len = inputStream.readLong();
System.out.println("파일 길이:" + len + "/n");
System.out.println("파일 받기 시작!" + "/n");
동안 (참) {
int 읽기 = 0;
if (inputStream != null) {
읽기 = inputStream.read(buf);
}
전달됨 += 읽기;
if (읽기 == -1) {
부서지다;
}
//아래 진행률 표시줄은 원래 그래픽 인터페이스의 prograssBar용으로 만들어진 것입니다. 여기에서 파일을 인쇄하는 경우 동일한 비율 중 일부가 반복적으로 인쇄될 수 있습니다.
System.out.println("파일 수신됨" + (passedlen * 100/ len) + "%/n");
fileOut.write(buf, 0, 읽기);
}
System.out.println("수신 완료, 파일을 다른 이름으로 저장했습니다." + savePath + "/n");
fileOut.close();
} 잡기(예외 e) {
System.out.println("메시지 수신 오류" + "/n");
반품;
}
}
공개 정적 무효 메인(문자열 인수[]) {
새로운 클라이언트테스트();
}
}
이 글이 모든 사람의 Java 프로그래밍에 도움이 되기를 바랍니다.