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中正确通过Socket传输文件?的详细内容。更多信息请关注PHP中文网其他相关文章!