Java Socket文件传输

Java:Socket文件传输

此博客为实例代码,其余请参考我的其他博客:

Java TCP通信https://blog.csdn.net/qq_39004632/article/details/93598528
Java 多线程Sockethttps://blog.csdn.net/qq_39004632/article/details/93599058
Java TCP传输对象https://blog.csdn.net/qq_39004632/article/details/93602381

客户端代码:

public class FileTransferClient {

	private Socket socket;
	private int port = 20001;

	public FileTransferClient() {
		try {
			socket = new Socket(InetAddress.getByName("localhost"), port);
			System.out.println("与服务器连接成功");
		} catch (Exception ex) {
			System.out.println("与服务器连接失败");
			ex.printStackTrace();
		}
	}

	public void receive() {
		try {
			String savePath = "E:\\"; // 本地保存路径
			byte buffer[] = new byte[8192]; // 接收数据的缓冲区
			int passedlen = 0;
			long len = 0;

			// 打开socket的输入流(也就是服务器端的输出流)
			DataInputStream inputStream = new DataInputStream(socket.getInputStream());
			savePath += inputStream.readUTF(); // 读取文件名

			// 创建对文件进行写操作的输出流
			DataOutputStream fileOut = new DataOutputStream((new BufferedOutputStream(new FileOutputStream(savePath))));
			len = inputStream.readLong(); // 读取文件的长度

			System.out.println("文件的长度为:" + len);
			System.out.println("开始接收文件!");

			while (true) {
				int read = 0;
				if (inputStream != null) {
					read = inputStream.read(buffer);
				}
				passedlen += read;
				if (read == -1) {
					break;
				}

				System.out.println("文件接收了" + (passedlen * 100 / len) + "%\n");
				fileOut.write(buffer, 0, read);
			}
			System.out.println("接收完成,文件存为" + savePath + "\n");

			fileOut.close();
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String arg[]) {
		new FileTransferClient().receive();
	}

}

服务器代码:

public class FileTransferServer {

	private String filePath; // 文件路径
	private String fileSize; // 文件大小
	private int port; // 端口号
	private ServerSocket server; // 服务器端Socket

	public FileTransferServer(int port, String filePath) throws IOException {
		this.port = port;
		this.filePath = filePath;
		server = new ServerSocket(port);
	}

	public void transfer() {
		try {
			File file = new File(filePath); // 创建要传递的文件对象
			System.out.println("要传递的文件大小是:" + file.length());

			Socket socket = server.accept(); // 监听客户端的请求
			System.out.println("服务器已经与客户端建立连接");

			// 创建输入流与要传递的文件进行关联
			DataInputStream dInStream = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));

			DataOutputStream serverOutputStream = new DataOutputStream(socket.getOutputStream());
			// 将文件名和文件长度传递给客户端,考虑到文件名是中文的格式用writeUTF方法
			serverOutputStream.writeUTF(file.getName());
			serverOutputStream.flush();
			serverOutputStream.writeLong((long) file.length());
			serverOutputStream.flush();

			// 以下代码用于发送文件的内容部分
			byte buffer[] = new byte[8129]; // 数据缓冲区8K
			while (true) {
				int read = 0;
				if (dInStream != null) {
					read = dInStream.read(buffer); // 从文件关联的输入流中读取数据
					if (read != -1)
						serverOutputStream.write(buffer, 0, read); // 将缓冲区中的数据写入到Socket的输出流中
					else
						break;
				}
			}
			serverOutputStream.flush(); // 强制将缓冲区的数据输出

			System.out.println("文件传送完毕");
			dInStream.close();
			serverOutputStream.close();
			socket.close(); // 关闭流和socket
		} catch (FileNotFoundException e1) {
			System.out.println("要传送的文件不存在");
		} catch (SocketException e2) {
			e2.printStackTrace();
		} catch (IOException e3) {
			e3.printStackTrace();
		}
	}

	public static void main(String args[]) throws IOException {
		new FileTransferServer(20001, "D:\\abc.rar").transfer();
	}

}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Java Socket文件传输代码示例: // 服务器端代码 import java.net.*; import java.io.*; public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(4444); Socket clientSocket = serverSocket.accept(); InputStream inputStream = clientSocket.getInputStream(); FileOutputStream fileOutputStream = new FileOutputStream("received_file.txt"); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { fileOutputStream.write(buffer, 0, bytesRead); } fileOutputStream.close(); inputStream.close(); clientSocket.close(); serverSocket.close(); } } // 客户端代码 import java.net.*; import java.io.*; public class Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost", 4444); File file = new File("file_to_send.txt"); FileInputStream fileInputStream = new FileInputStream(file); OutputStream outputStream = socket.getOutputStream(); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = fileInputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } fileInputStream.close(); outputStream.close(); socket.close(); } } 这个示例中,服务器监听端口4444,并等待客户端连接。客户端连接到服务器并打开一个文件,将其内容通过Socket发送给服务器。服务器接收数据并将其写入一个名为“received_file.txt”的文件。请注意,这个示例没有错误处理和验证代码,仅作为演示用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值