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

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

Susan Sarandon
Susan Sarandon원래의
2024-11-03 13:59:31269검색

How to Correctly Transfer Files Over Sockets in Java?

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

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

서버측 문제

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

<code class="java">byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
    fos.write(buffer, 0, bytesRead);
}</code>

클라이언트 측 문제

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

<code class="java">FileInputStream is = new FileInputStream(file);
byte[] bytes = new byte[(int) length];
is.read(bytes);
out.write(bytes);</code>

개선된 코드

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

서버:

<code class="java">...
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();
...</code>

클라이언트:

<code class="java">...
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);
...</code>

위 내용은 Java에서 소켓을 통해 파일을 올바르게 전송하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.