소켓을 통한 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!