TCP 复制文件

本文通过Java实现了一个简单的TCP客户端和服务端程序,演示了如何利用TCP进行文件的发送与接收。客户端读取本地文件并将其内容发送到指定的服务器地址及端口;服务器接收文件内容并保存为新文件,同时向客户端反馈上传成功的信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
TCP 复制文件

*/

import java.net.*;
import java.io.*;

class TextClient {		//客户端
	public static void main(String[] args) throws Exception {
		Socket s = new Socket("172.16.41.154", 10003);
		InputStream in = s.getInputStream();
		OutputStream out = s.getOutputStream();

		BufferedReader bufr = new BufferedReader(new FileReader("IPDemo01.java"));
		PrintWriter pw = new PrintWriter(out, true);
		String line = null;
		while((line = bufr.readLine()) != null) {
			pw.println(line);
		}
		s.shutdownOutput();

		BufferedReader skBufr = new BufferedReader(new InputStreamReader(in));
		String str = skBufr.readLine();
		System.out.println(str);

		s.close();
		bufr.close();
	}
}

class TextServer {		//服务端
	public static void main(String[] args) throws Exception {
		ServerSocket ss = new ServerSocket(10003);
		Socket s = ss.accept();

		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip + "....connecting");
		InputStream in = s.getInputStream();
		OutputStream out = s.getOutputStream();

		BufferedReader skBufr = new BufferedReader(new InputStreamReader(in));
		PrintWriter pw = new PrintWriter(new FileWriter("IPDemo01_copy.txt"), true);
		String line = null;
		while((line = skBufr.readLine()) != null) {
			pw.println(line);
		}
		//PrintWriter skPw = new PrintWriter(s.getOutputStream(),true);
		//skPw.println("上传成功");
		BufferedWriter skBufw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		skBufw.write("上传成功");
		skBufw.newLine();
		skBufw.flush();

	}
}

在使用TCP协议传输文件的实现方法中,通常需要构建服务器端和客户端程序,并通过网络流进行数据传输。以下是一个基于C#语言的示例实现,适用于WPF应用程序,可作为参考来理解基本逻辑。 ### 服务器端代码 服务器端负责监听客户端连接请求,并接收或发送文件内容。以下代码展示了如何创建一个简单的TCP服务器来接收文件: ```csharp using System; using System.IO; using System.Net; using System.Net.Sockets; class Server { static void Main() { TcpListener server = new TcpListener(IPAddress.Any, 5000); server.Start(); Console.WriteLine("Server started..."); while (true) { TcpClient client = server.AcceptTcpClient(); NetworkStream stream = client.GetStream(); // 接收文件名长度 byte[] fileNameLengthBuffer = new byte[4]; stream.Read(fileNameLengthBuffer, 0, 4); int fileNameLength = BitConverter.ToInt32(fileNameLengthBuffer, 0); // 接收文件名 byte[] fileNameBuffer = new byte[fileNameLength]; stream.Read(fileNameBuffer, 0, fileNameLength); string fileName = Encoding.UTF8.GetString(fileNameBuffer); // 接收文件大小 byte[] fileSizeBuffer = new byte[8]; stream.Read(fileSizeBuffer, 0, 8); long fileSize = BitConverter.ToInt64(fileSizeBuffer, 0); // 接收文件内容 using (FileStream fs = new FileStream(fileName, FileMode.Create)) { byte[] buffer = new byte[1024]; int bytesRead; long remainingBytes = fileSize; while (remainingBytes > 0 && (bytesRead = stream.Read(buffer, 0, Math.Min(buffer.Length, (int)remainingBytes))) > 0) { fs.Write(buffer, 0, bytesRead); remainingBytes -= bytesRead; } } Console.WriteLine("File received: " + fileName); client.Close(); } } } ``` ### 客户端代码 客户端负责连接服务器并发送文件。以下是客户端发送文件的实现示例: ```csharp using System; using System.IO; using System.Net.Sockets; class Client { static void Main() { TcpClient client = new TcpClient("127.0.0.1", 5000); NetworkStream stream = client.GetStream(); string filePath = @"C:\path\to\your\file.zip"; string fileName = Path.GetFileName(filePath); byte[] fileNameBuffer = Encoding.UTF8.GetBytes(fileName); byte[] fileNameLengthBuffer = BitConverter.GetBytes(fileNameBuffer.Length); // 发送文件名长度 stream.Write(fileNameLengthBuffer, 0, fileNameLengthBuffer.Length); // 发送文件名 stream.Write(fileNameBuffer, 0, fileNameBuffer.Length); // 获取文件大小 FileInfo fileInfo = new FileInfo(filePath); byte[] fileSizeBuffer = BitConverter.GetBytes(fileInfo.Length); // 发送文件大小 stream.Write(fileSizeBuffer, 0, fileSizeBuffer.Length); // 发送文件内容 using (FileStream fs = new FileStream(filePath, FileMode.Open)) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0) { stream.Write(buffer, 0, bytesRead); } } Console.WriteLine("File sent."); client.Close(); } } ``` ### 实现说明 - **服务器端**:使用`TcpListener`监听指定端口(如5000),接收到客户端连接后,读取文件名、文件大小以及文件内容,并将其保存到本地。 - **客户端**:通过`TcpClient`连接服务器,将文件名、文件大小及文件内容逐段发送给服务器。 以上代码仅用于演示目的,实际应用中可能需要增加异常处理、断点续传等高级功能[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值