Java Socket 파일 전송 예제 코드 구현
클 라 이언 트 디자인 사고방식:클 라 이언 트 와 서버 가 연결 을 맺 고 클 라 이언 트 로 컬 파일 을 선택 하면 먼저 파일 이름과 크기 등 속성 을 서버 에 보 내 고 파일 을 흐 르 는 방식 으로 서버 에 전송 한다.전송 이 끝 날 때 까지 콘 솔 에 전송 진 도 를 인쇄 합 니 다.
서버 설계 사고방식:서버 에서 클 라 이언 트 의 요청(차단 식)을 받 습 니 다.클 라 이언 트 가 연결 을 요청 할 때마다 파일 을 처리 하 는 라인 을 새로 열 고 흐름 에 기록 하기 시작 합 니 다.서버 의 지정 한 디 렉 터 리 에 파일 을 넣 고 전 송 된 파일 과 이름 이 같 습 니 다.
다음은 클 라 이언 트 와 서버 의 코드 구현 입 니 다.
클 라 이언 트 코드:
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.Socket;
/**
* Client <br>
* :
*
* @author
* @Date 2016 09 01
* @version 1.0
*/
public class FileTransferClient extends Socket {
private static final String SERVER_IP = "127.0.0.1"; // IP
private static final int SERVER_PORT = 8899; //
private Socket client;
private FileInputStream fis;
private DataOutputStream dos;
/**
* <br/>
*
* @throws Exception
*/
public FileTransferClient() throws Exception {
super(SERVER_IP, SERVER_PORT);
this.client = this;
System.out.println("Cliect[port:" + client.getLocalPort() + "] ");
}
/**
*
* @throws Exception
*/
public void sendFile() throws Exception {
try {
File file = new File("E:\\JDK1.6 (JDK_API_1_6_zh_CN).CHM");
if(file.exists()) {
fis = new FileInputStream(file);
dos = new DataOutputStream(client.getOutputStream());
//
dos.writeUTF(file.getName());
dos.flush();
dos.writeLong(file.length());
dos.flush();
//
System.out.println("======== ========");
byte[] bytes = new byte[1024];
int length = 0;
long progress = 0;
while((length = fis.read(bytes, 0, bytes.length)) != -1) {
dos.write(bytes, 0, length);
dos.flush();
progress += length;
System.out.print("| " + (100*progress/file.length()) + "% |");
}
System.out.println();
System.out.println("======== ========");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(fis != null)
fis.close();
if(dos != null)
dos.close();
client.close();
}
}
/**
*
* @param args
*/
public static void main(String[] args) {
try {
FileTransferClient client = new FileTransferClient(); //
client.sendFile(); //
} catch (Exception e) {
e.printStackTrace();
}
}
}
서버 코드:
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.math.RoundingMode;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DecimalFormat;
/**
* Server <br>
* :
*
* @author
* @Date 2016 09 01
* @version 1.0
*/
public class FileTransferServer extends ServerSocket {
private static final int SERVER_PORT = 8899; //
private static DecimalFormat df = null;
static {
// ,
df = new DecimalFormat("#0.0");
df.setRoundingMode(RoundingMode.HALF_UP);
df.setMinimumFractionDigits(1);
df.setMaximumFractionDigits(1);
}
public FileTransferServer() throws Exception {
super(SERVER_PORT);
}
/**
*
* @throws Exception
*/
public void load() throws Exception {
while (true) {
// server Socket ,server accept
Socket socket = this.accept();
/**
* , ,
* 。 ,
* ,
*/
// Socket
new Thread(new Task(socket)).start();
}
}
/**
*
*/
class Task implements Runnable {
private Socket socket;
private DataInputStream dis;
private FileOutputStream fos;
public Task(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
dis = new DataInputStream(socket.getInputStream());
//
String fileName = dis.readUTF();
long fileLength = dis.readLong();
File directory = new File("D:\\FTCache");
if(!directory.exists()) {
directory.mkdir();
}
File file = new File(directory.getAbsolutePath() + File.separatorChar + fileName);
fos = new FileOutputStream(file);
//
byte[] bytes = new byte[1024];
int length = 0;
while((length = dis.read(bytes, 0, bytes.length)) != -1) {
fos.write(bytes, 0, length);
fos.flush();
}
System.out.println("======== [File Name:" + fileName + "] [Size:" + getFormatFileSize(fileLength) + "] ========");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(fos != null)
fos.close();
if(dis != null)
dis.close();
socket.close();
} catch (Exception e) {}
}
}
}
/**
*
* @param length
* @return
*/
private String getFormatFileSize(long length) {
double size = ((double) length) / (1 << 30);
if(size >= 1) {
return df.format(size) + "GB";
}
size = ((double) length) / (1 << 20);
if(size >= 1) {
return df.format(size) + "MB";
}
size = ((double) length) / (1 << 10);
if(size >= 1) {
return df.format(size) + "KB";
}
return length + "B";
}
/**
*
* @param args
*/
public static void main(String[] args) {
try {
FileTransferServer server = new FileTransferServer(); //
server.load();
} catch (Exception e) {
e.printStackTrace();
}
}
}
테스트 결과(클 라 이언 트):테스트 결과(서버):
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.