吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3475|回复: 2
收起左侧

[Java 转载] [网络编程] 上传文件

[复制链接]
夜袭和尚庙 发表于 2019-6-5 20:20
自学到了网络编程 就按照我的思路 写了一个上传文件至服务器  效果还不错 还有什么能够改进的地方,自学代码难免会不规范,请各位大佬们不要藏着掖着
服务端会默认在服务器F盘下创建一个文件夹 用于存储上传的文件
默认端口为:44555
客户端上传的文件要写绝对路径。。。而且路径中的 '\' 要再加个 '\' 转义。。。 实在是不知道怎么让用户输入文件名  程序获取到文件对象了。。。。而且没有界面化 所以不太好做 就先做了一个简单版。。。。以后有机会把下载也写出来 挖个坑
001.png
002.png
上传的文件可以正常使用QWQ 代码如下:
Server:
[Asm] 纯文本查看 复制代码
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
	private static final int BUF_SIZE = 15728640;// 缓冲区大小为15M

	public static void main(String[] args) throws IOException {
		System.out.println("服务端已启动!");
		
		// 定义缓冲区大小为15M
		byte[] buf = new byte[BUF_SIZE];
		
		// 服务端文件存储位置 默认为E盘下的FileDir
		File DownDir = new File("F:\\", "FileDir");
		
		// 创建服务端存储目录
		if (!(DownDir.exists() || DownDir.isDirectory())) {
			DownDir.mkdirs();
		}
		
		// 创建服务端Socket 端口为44555
		ServerSocket ss = new ServerSocket(44555);
		while(true) {
			//获取客户端流对象
			Socket s = ss.accept();
			System.out.println(s.getInetAddress().getHostAddress()+" Connection..");
			OutputStream out = s.getOutputStream();
			InputStream in = s.getInputStream();
			/*第一次与客户端交互	服务端发送至客户端
			 * 	 获取磁盘大小低于5G空间 禁止上传
			 * 	返回值发送至客户端
			 * 		401 空间小于5G
			 */
			int size = getSize(DownDir);
			if(size < 5) {
				out.write("401".getBytes());
				s.close();
				continue;
			}else {
				out.write(("服务器磁盘空间还剩"+size+"G").getBytes());
			}
			//第二次交互	服务端接收客户端文件名
			byte[] TempName = new byte[1024];
			
			int TempLen = in.read(TempName);
			String fileName = new String(TempName,0,TempLen);
			//当客户端选择了目录时 返回错误404  释放客户端
			if(fileName.equals("404")) {
				s.close();
				continue;
			}

			File file = new File(DownDir,fileName);
			//判断目录下是否有该文件
			if(file.exists()) {
				/*
				 * 	第三次交互   服务端发送至客户端 
				 * 		文件已存在返回 504
				 */
				out.write("504".getBytes());
				s.close();
				continue;
			}else {
				out.write("服务器:正在上传中!请稍后!".getBytes());
				
				//缓冲区大小15M
				byte[] data = new byte[BUF_SIZE];
				FileOutputStream fos = new FileOutputStream(file);
				int len = 0;
				//从客户端获取  保存至本地
				while((len=in.read(data))!=-1) {
					fos.write(data, 0, len);
				}
				
				System.out.println("上传成功!");
				fos.close();
				s.close();
			}
		}
	}
	/*
	 * 该方法用于获取磁盘剩余大小  
	 */
	private static int getSize(File dir) {
		long l = dir.getFreeSpace();
		int i = (int) (l / 1024 / 1024 / 1024);
		return i;
	}
}



Client:
[Asm] 纯文本查看 复制代码
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class TCPClient {
	private static final int BUF_SIZE = 15728640;// 缓冲区大小为15M
	public static void main(String[] args) throws IOException {
		System.out.println("----------文件上传系统----------");
		Socket s = null;
		try {
			s = new Socket("192.168.82.53", 44555);			
		}catch(java.net.ConnectException e) {
			System.out.println("网络异常!请检查网络!");
			return;
		}
		//获取流对象
		InputStream in = s.getInputStream();
		OutputStream out = s.getOutputStream();
		
		//获取服务器磁盘大小
		String str = getSize(in);
		if(str.equals("401")) {
			System.out.println("服务器磁盘空间不足5G 请联系管理员!");
			s.close();
			return;
		}else {
			System.out.println(str);
			//发送文件名至客户端 判断服务器是否存在该文件
			File file = sendFileName(out,in);
			//为NULL结束程序
			if(file == null){
				s.close();
				return;
			}else {
				//上传文件
				int ret = SendFile(out,file);
				if(ret == -1) {
					System.out.println("服务器链接中断!请重试!");
					if(!(s.isClosed())) {
						s.close();
					}
					return;
				}
				System.out.println("上传成功");
				s.close();
			}
		}
	}
	
	//上传文件方法
	private static int SendFile(OutputStream out,File file) throws IOException {
		//关联文件
		FileInputStream fis = new FileInputStream(file);
		int len = 0;
		byte[] data = new byte[BUF_SIZE];
		while((len=fis.read(data))!=-1) {
			try {
				out.write(data,0,len);				
			}catch(java.net.SocketException e) {
				
				return -1;
			}
		}
		fis.close();
		return 0;
		
	}
	
	//发送文件名至客户端 判断服务器是否存在该文件方法
	private static File sendFileName(OutputStream out,InputStream in) throws IOException {
		Scanner input = new Scanner(System.in);
		
		//技术不够 。。。。dos下拿不到文件对象全名  只能够这样整了。。。
		System.out.print("请输入完整路径名(\\需要转义,推荐将文件拖进来然后加上转义符):");
		String Dir = input.nextLine();
		File file = new File(Dir);
		//判断是否为文件夹 如果是文件夹 发送至服务器404 返回NULL
		if(file.isDirectory()) {
			System.out.println("目录因技术问题暂时无法上传!");
			//第二次交互  客户端发送至服务器文件名
			out.write("404".getBytes());
			return null;
		}else {
			//非文件夹 就将文件名发送至服务器 返回文件对象
			out.write(file.getName().getBytes());
			
			/*第三次交互   
			 * 	判断服务器是否已存在该文件	已存在返回NULL
			 */
			byte[] temp = new byte[1024];
			int len = in.read(temp);
			String str = new String(temp,0,len);
			if(str.equals("504")) {
				System.out.println("文件已存在!程序结束!");
				return null;
			}else{
				System.out.println(str);
				return file;			
			}
		}
		
	}
	/*第一次与客户端交互	服务端发送至客户端
	 * 	 获取磁盘大小低于5G空间 禁止上传
	 * 	返回值发送至客户端
	 * 		401 空间小于5G
	 */
	private static String getSize(InputStream in) throws IOException {
		byte[] temp = new byte[1024];
		int len = in.read(temp);
		String str = new String(temp,0,len);
		return str;
		
	}
}


希望能和大家共同进步QWQ

免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
安迪烙 + 1 我很赞同!
xuannao + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

vethenc 发表于 2019-6-5 21:07
友情支持
羊毛丶 发表于 2019-6-5 23:12
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 09:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表