"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Java에서 소켓을 통해 파일을 올바르게 전송하는 방법은 무엇입니까?

Java에서 소켓을 통해 파일을 올바르게 전송하는 방법은 무엇입니까?

2024년 11월 17일에 게시됨
검색:360

How to Correctly Transfer Files Over Sockets in Java?

소켓을 통한 Java 파일 전송: 바이트 배열 전송 및 수신

Java에서 소켓을 통해 파일을 전송하려면 파일을 바이트 배열로 변환해야 합니다. 소켓을 통해 전송한 다음 수신 측에서 바이트를 다시 파일로 변환합니다. 이 문서에서는 이 파일 전송 기능을 구현할 때 Java 개발자가 직면한 문제를 다룹니다.

서버측 문제

서버 코드가 수신 시 빈 파일을 생성하는 것으로 나타납니다. 클라이언트의 데이터. 이 문제를 해결하려면 서버는 루프를 사용하여 클라이언트가 보낸 데이터를 청크로 읽어서 버퍼를 사용하여 데이터를 임시 저장해야 합니다. 모든 데이터가 수신되면 서버는 전체 파일을 쓸 수 있습니다. 수정된 서버 코드는 다음과 같습니다:

byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
    fos.write(buffer, 0, bytesRead);
}

클라이언트측 문제

클라이언트 코드는 처음에 빈 바이트 배열을 서버에 보냅니다. 실제 파일 콘텐츠를 보내려면 다음 코드를 사용해야 합니다.

FileInputStream is = new FileInputStream(file);
byte[] bytes = new byte[(int) length];
is.read(bytes);
out.write(bytes);

개선된 코드

앞서 언급한 수정 사항을 적용하면 서버와 클라이언트의 전체 코드는 다음과 같습니다.

섬기는 사람:

...
byte[] buffer = new byte[1024];
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

FileOutputStream fos = new FileOutputStream("C:\\test2.xml");
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
    fos.write(buffer, 0, bytesRead);
}
fos.close();
...

고객:

...
Socket socket = new Socket(host, 4444);
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

File file = new File("C:\\test.xml");
FileInputStream is = new FileInputStream(file);
long length = file.length();
if (length > Integer.MAX_VALUE) {
    System.out.println("File is too large.");
}
byte[] bytes = new byte[(int) length];
is.read(bytes);
out.write(bytes);
...
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3