在Java中,局域网文件传输可以通过多种方式实现,包括基于Socket的TCP协议、基于Datagram的UDP协议以及使用FTP、HTTP等协议,本文将详细介绍如何使用Java实现基于Socket的TCP协议的局域网文件传输。
1、建立Socket连接
我们需要在发送端和接收端分别建立一个Socket连接,发送端负责读取本地文件并将其内容发送到接收端,接收端负责接收文件内容并将其写入本地文件。
// 发送端 import java.io.*; import java.net.*; public class SendFile { public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost", 8888); File file = new File("example.txt"); byte[] buffer = new byte[1024]; int length; InputStream in = new FileInputStream(file); while ((length = in.read(buffer)) != -1) { socket.getOutputStream().write(buffer, 0, length); } in.close(); socket.close(); } }
// 接收端 import java.io.*; import java.net.*; public class ReceiveFile { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8888); Socket socket = serverSocket.accept(); File file = new File("received_example.txt"); byte[] buffer = new byte[1024]; int length; OutputStream out = new FileOutputStream(file); while ((length = socket.getInputStream().read(buffer)) != -1) { out.write(buffer, 0, length); } out.close(); socket.close(); serverSocket.close(); } }
2、多线程传输文件
为了提高文件传输速度,我们可以使用多线程进行文件传输,发送端和接收端都可以创建多个线程来并行处理文件传输任务。
// 发送端多线程示例 public class SendFileMultiThread { public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost", 8888); File file = new File("example.txt"); byte[] buffer = new byte[1024]; int length; InputStream in = new FileInputStream(file); int blockSize = 1024 * 1024; // 每次读取1MB数据 int totalBlocks = (int) (file.length() / blockSize); // 计算总块数 for (int i = 0; i < totalBlocks; i++) { int startIndex = i * blockSize; // 计算当前块的起始索引 int endIndex = Math.min(startIndex + blockSize, (int) file.length()); // 计算当前块的结束索引 in.skip(startIndex); // 跳过已读取的数据,定位到当前块的起始位置 int bytesRead = in.read(buffer, 0, endIndex startIndex); // 读取当前块的数据到buffer中 socket.getOutputStream().write(buffer, 0, bytesRead); // 将当前块的数据发送到接收端 } in.close(); socket.close(); } }
3、断点续传功能
为了实现断点续传功能,我们需要在发送端记录已发送的文件大小,并在接收端根据已接收的文件大小来读取剩余的文件内容,当接收端收到完整的文件时,关闭连接并保存文件。
// 发送端记录已发送的文件大小(以字节为单位) long sentBytes = 0; // 初始化已发送的文件大小为0 // ...省略其他代码... while ((length = in.read(buffer)) != -1) { socket.getOutputStream().write(buffer, 0, length); sentBytes += length; // 更新已发送的文件大小 } // ...省略其他代码...
// 接收端根据已接收的文件大小来读取剩余的文件内容(以字节为单位) long receivedBytes = 0; // 初始化已接收的文件大小为0(从发送端获取) // ...省略其他代码... while ((length = socket.getInputStream().read(buffer)) != -1) { out.write(buffer, 0, length); // 将接收到的数据写入文件,直到文件完整或发生错误为止 receivedBytes += length; // 更新已接收的文件大小(从发送端获取) } // ...省略其他代码...
4、异常处理与资源释放
在进行文件传输过程中,我们需要对可能出现的异常进行处理,并在操作完成后释放资源,我们可以使用try-catch语句来捕获异常,并在finally语句中关闭资源。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/229246.html