自学到了网络编程 就按照我的思路 写了一个上传文件至服务器 效果还不错 还有什么能够改进的地方,自学代码难免会不规范,请各位大佬们不要藏着掖着
服务端会默认在服务器F盘下创建一个文件夹 用于存储上传的文件
默认端口为:44555
客户端上传的文件要写绝对路径。。。而且路径中的 '\' 要再加个 '\' 转义。。。 实在是不知道怎么让用户输入文件名 程序获取到文件对象了。。。。而且没有界面化 所以不太好做 就先做了一个简单版。。。。以后有机会把下载也写出来 挖个坑
上传的文件可以正常使用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 |