Ftp文件上传的实现

本文介绍如何使用TCP协议通过客户端与服务器之间的连接实现文件上传功能,包括客户端连接服务器、指定待上传文件路径、传输文件头信息及实际文件数据的过程,以及服务器接收并保存文件的方法。

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

客户端

package question10;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;

/*
 * 使用TCP协议写一个可以上传文件的服务器和客户端。
 * 
 * 客户端类
 * 
 * 老师运行完要F5刷新下项目
 */

public class FTPClient
{
	public static void main(String[] args) throws Exception
	{
		//链接服务器,127.0.0.1表示本机,5678为端口号
		Socket socket = new Socket("127.0.0.1", 5678);
		System.out.println("conneted server");
		

		//需要上传的文件路径,这里是当前这个java源文件
		String path = System.getProperty("user.dir")+File.separator+"src"+File.separator+"question10"
				+File.separator+"FTPClient.java";

		//根据路径链接到本机文件系统
		File file = new File(path);
		
		//取得到服务器的输出流,用来写入数据
		DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
		System.out.println("start write");
		writeHead(dos, file);
		writeFile(dos, file);
		System.out.println("write finished");
	}
	
	/**
	 * 写传输头,这里只是文件名字
	 */
	public static void writeHead(DataOutputStream dos, File file) throws IOException
	{
		dos.writeUTF(file.getName());
		dos.flush();
	}
	
	/**
	 * 读取文件并传输给服务器
	 */
	public static void writeFile(DataOutputStream dos, File file) throws IOException
	{
		DataInputStream dis = new DataInputStream(new FileInputStream(file));
		//超过两个G的文件会出问题,获取不到准确的大小
		//并且dis.available() > 0表达式也不能正确
		//工作
		dos.writeInt(dis.available());
		System.out.println("file size " + dis.available() + " bytes");
		while(dis.available() > 0)
		{
			dos.write(dis.read());
		}
		dos.flush();
	}
}


服务器
package question10;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/*
 * 使用TCP协议写一个可以上传文件的服务器和客户端。
 * 
 * 服务器类
 * 
 * 老师运行完要F5刷新下项目
 */
public class FTPServer
{
	public static void main(String[] args) throws Exception
	{
		//启动服务器,并监听5678端口的链接请求
		ServerSocket ss = new ServerSocket(5678);
		Socket client = ss.accept();
		System.out.println("client conneted");
		
		//建立到客户端的输入流,用以读取数据
		DataInputStream dis = new DataInputStream(client.getInputStream());
		//读取数据头,即文件名
		String fileName = readHead(dis);
		System.out.println("start read " + fileName);
		
		//服务器将要保存从客户端上传的文件的路径
		//这里是当前这个服务器java源文件的所在目录
		//传完F5刷新下项目
		String path = System.getProperty("user.dir")+File.separator+"src"+File.separator+"question10"
				+File.separator;
		//给保存的文件加了点东西,要不就把这个客户端
		//那个java源文件给覆盖了,看不出来效果
		File file = new File(path + fileName.replace(".", "$1."));
		readFile(dis, file);
		System.out.println("read finished");
	}
	
	/**
	 * 读取并返回数据头,也就是文件名字
	 */
	public static String readHead(DataInputStream dis) throws IOException
	{
		return dis.readUTF();
	}
	
	/**
	 * 读取客户端传来的文件数据并写入本地文件
	 */
	public static void readFile(DataInputStream dis, File file) throws IOException
	{
		//取得文件大小
		int length = dis.readInt();
		//将文件数据写如本地文件
		DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
		//创建文件
		file.createNewFile();
		for (int i = 0; i < length; i++)
        {
	        dos.write(dis.read());
        }
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值