首页 > Java > java教程 > 正文

如何在Java中正确通过Socket传输文件?

Susan Sarandon
发布: 2024-11-03 13:59:31
原创
288 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板