”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在Java中正确通过套接字传输文件?

如何在Java中正确通过套接字传输文件?

发布于2024-11-17
浏览:885

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