夜袭和尚庙 发表于 2019-6-5 20:20

[网络编程] 上传文件

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


上传的文件可以正常使用QWQ 代码如下:
Server:

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;
               
                // 服务端文件存储位置 默认为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;
                       
                        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;
                                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:

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;
                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;
                        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;
                int len = in.read(temp);
                String str = new String(temp,0,len);
                return str;
               
        }
}


希望能和大家共同进步QWQ

vethenc 发表于 2019-6-5 21:07

友情支持

羊毛丶 发表于 2019-6-5 23:12

选择文件可以用 javax.swing.JFileChooser
页: [1]
查看完整版本: [网络编程] 上传文件