Jimsss1024 2022-05-03 12:38 采纳率: 50%
浏览 47

用Java Socket开发的网盘创建删除出了问题

自己用Java Socket开发的一个网盘,创建删除出了问题
Swing窗口中有4个按钮,分别是”创建 删除 上传 下载“(上传和下载没开发出来,主要不是这个。是创建和删除)
登陆后-第1次按创建/删除按钮时服务器会报错无法创建文件/删除文件
-第2次按的时候才会创建/删除上一次的文件,第2次的创建/删除的文件会在第3次的时候创建/删除,第3次会被推迟到第4次,以此类推

客户端:
package com.ruilong.software;

import javax.swing.*;
import javax.swing.plaf.FontUIResource;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;

/**
 * @author Jimsss
 * @version 1.0
 * @deprecated 软件主类
 */

public class Software {
    public JFrame softwareFrame = new JFrame();
    public JPanel panel = new JPanel();
    public JMenuBar menuBar = new JMenuBar();
    public JMenu softwareMenu = new JMenu();
    public JMenuItem exitMenuItem = new JMenuItem();
    public JMenuItem deleteUserMenuItem = new JMenuItem();
    public JMenuItem aboutMenuItem = new JMenuItem();
    public JLabel softwareLabel = new JLabel();

    public Font allFont = new Font("宋体",Font.PLAIN,32);

    public static LoginOrRegister LOGIN_OR_REGISTER = new LoginOrRegister();

    public String titleMsg = "RuiLongSoftware";
    public String aboutMsg = "Jimsss";
    public String welcomeAdmin = "----------------欢迎您,管理员!----------------";
    public String welcomeUser1 = "欢迎您";
    public String welcomeUser2 = "用户";
    public String softwareMenuMsg = "软件";
    public String exitMenuItemMsg = "退出软件";
    public String deleteUserMenuItemMsg = "注销账户";
    public String aboutMenuItemMsg = "关于我们";

    public int width = 800;
    public int height = 500;

    public JButton creativeFileButton = new JButton();
    public JButton deleteFileButton = new JButton();
    public JButton uploadFileButton = new JButton();
    public JButton downloadFileButton = new JButton();

    public String creativeFileButtonMsg = "创建文件";
    public String deleteFileButtonMsg = "删除文件";
    public String uploadFileButtonMsg = "上传文件";
    public String downloadFileButtonMsg = "下载文件";

    public JFrame fileFrame = new JFrame();
    public JPanel filePanel = new JPanel();

    public JLabel label = new JLabel();
    public JTextField textField = new JTextField();
    public JButton button = new JButton();

    public String filePath = "C:\\Nginx\\nginx-1.20.2\\html\\user\\";

    //Socket
    public Socket socket = new Socket();
    public String serverIP = "127.0.0.1";
    public int serverPort = 8192;
    public BufferedWriter bufferedWriter;

    public String userName1;
    public String errorMsg = "客户端错误,请检查Java错误代码:";

    public void SoftwareWindow(String userName){
        softwareFrame.setTitle(titleMsg);
        softwareFrame.setSize(width,height);
        softwareFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        softwareFrame.setResizable(false);
        softwareFrame.setContentPane(panel);
        softwareFrame.setJMenuBar(menuBar);
        softwareFrame.getContentPane().setBackground(Color.WHITE);

        softwareMenu.setText(softwareMenuMsg);
        softwareMenu.setFont(allFont);
        menuBar.add(softwareMenu);

        exitMenuItem.setText(exitMenuItemMsg);
        exitMenuItem.setFont(allFont);
        exitMenuItem.setBackground(Color.ORANGE);
        exitMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        softwareMenu.add(exitMenuItem);
        softwareMenu.addSeparator();

        deleteUserMenuItem.setText(deleteUserMenuItemMsg);
        deleteUserMenuItem.setFont(allFont);
        deleteUserMenuItem.setBackground(Color.BLUE);
        deleteUserMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                LOGIN_OR_REGISTER.deleteUser(userName);
            }
        });
        softwareMenu.add(deleteUserMenuItem);

        aboutMenuItem.setText(aboutMenuItemMsg);
        aboutMenuItem.setFont(allFont);
        aboutMenuItem.setBackground(Color.CYAN);
        aboutMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                UIManager.put("OptionPane.buttonFont", new FontUIResource(allFont));
                UIManager.put("OptionPane.messageFont", new FontUIResource(allFont));
                JOptionPane.showMessageDialog(null, aboutMsg);
            }
        });
        softwareMenu.add(aboutMenuItem);

        softwareLabel.setFont(allFont);
        if (userName.equals("Admin")){
            softwareLabel.setForeground(Color.RED);
            softwareLabel.setText(welcomeAdmin);
        }else {
            softwareLabel.setForeground(Color.BLUE);
            softwareLabel.setText(welcomeUser1 + userName + welcomeUser2);
        }

        panel.add(softwareLabel);

        //SOFTWARE
        creativeFileButton.setFont(allFont);
        creativeFileButton.setForeground(Color.RED);
        creativeFileButton.setText(creativeFileButtonMsg);
        creativeFileButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                FileWindow();

                //Socket
                try {
                    socket = new Socket(serverIP, serverPort);
                    bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                    bufferedWriter.write(userName);
                    bufferedWriter.newLine();
                    bufferedWriter.write("creative");
                    bufferedWriter.newLine();
                    bufferedWriter.write(filePath);
                    bufferedWriter.flush();
                    socket.shutdownOutput();
                }catch (IOException exception){
                    System.out.println(errorMsg + exception);
                }

            }
        });
        panel.add(creativeFileButton);

        deleteFileButton.setFont(allFont);
        deleteFileButton.setForeground(Color.RED);
        deleteFileButton.setText(deleteFileButtonMsg);
        deleteFileButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                FileWindow();

                //Socket
                try {
                    socket = new Socket(serverIP, serverPort);
                    bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                    bufferedWriter.write(userName);
                    bufferedWriter.newLine();
                    bufferedWriter.write("delete");
                    bufferedWriter.newLine();
                    bufferedWriter.write(filePath);
                    bufferedWriter.flush();
                    socket.shutdownOutput();
                }catch (IOException exception){
                    System.out.println(errorMsg + exception);
                }

            }
        });
        panel.add(deleteFileButton);

        uploadFileButton.setFont(allFont);
        uploadFileButton.setForeground(Color.RED);
        uploadFileButton.setText(uploadFileButtonMsg);
        uploadFileButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                FileWindow();

                //Socket
                try {
                    socket = new Socket(serverIP, serverPort);
                    bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                    bufferedWriter.write(userName);
                    bufferedWriter.newLine();
                    bufferedWriter.write("upLoad");
                    bufferedWriter.newLine();
                    bufferedWriter.write(filePath);
                    bufferedWriter.flush();
                    socket.shutdownOutput();
                }catch (IOException exception){
                    System.out.println(errorMsg + exception);
                }

            }
        });
        panel.add(uploadFileButton);

        downloadFileButton.setFont(allFont);
        downloadFileButton.setForeground(Color.RED);
        downloadFileButton.setText(downloadFileButtonMsg);
        downloadFileButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                FileWindow();

                //Socket
                try {
                    socket = new Socket(serverIP, serverPort);
                    bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                    bufferedWriter.write(userName);
                    bufferedWriter.newLine();
                    bufferedWriter.write("DownLoad");
                    bufferedWriter.newLine();
                    bufferedWriter.write(filePath);
                    bufferedWriter.flush();
                    socket.shutdownOutput();
                }catch (IOException exception){
                    System.out.println(errorMsg + exception);
                }

            }
        });
        panel.add(downloadFileButton);
        userName1 = userName;

        softwareFrame.setVisible(true);
    }
    public void FileWindow(){
        fileFrame.setTitle(titleMsg);
        fileFrame.setSize(width,height);
        fileFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        fileFrame.setResizable(false);
        fileFrame.setContentPane(filePanel);
        fileFrame.getContentPane().setBackground(Color.WHITE);

        label.setFont(allFont);
        label.setText("目录");
        label.setForeground(Color.BLUE);
        filePanel.add(label);

        textField.setFont(allFont);
        textField.setColumns(20);
        textField.setText("");
        textField.setForeground(Color.RED);
        filePanel.add(textField);

        button.setFont(allFont);
        button.setText("好");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                filePath = "C:\\Nginx\\nginx-1.20.2\\html\\user\\" + userName1 + "\\" + textField.getText() + "\\";
                fileFrame.setVisible(false);
            }
        });
        filePanel.add(button);

        fileFrame.setVisible(true);
    }
}

客户端首先向服务器发送用户名 再发送命令 最后发送路径
然后服务器监听到信息就会接收在根据内容删除/创建

服务器:
package com.ruilong.server;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public ServerSocket serverSocket = null;
    public Socket socket = new Socket();
    public BufferedReader bufferedReader = null;
    public String userName = null;
    public String serverCommand = null;
    public String filePath = null;

    public File file = null;

    public void Server(int serverPort) {
        try {
            serverSocket = new ServerSocket(serverPort);
            System.out.println("RuiLong网盘服务器");
            System.out.println("正在监听服务端......");
            System.out.println("服务器IP:" + serverSocket.getInetAddress().getHostAddress());
            System.out.println("服务器端口号:" + serverSocket.getLocalPort());
            System.out.println("----------------------------------------------------------");
            for (; true; ) {
                socket = serverSocket.accept();
                bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                userName = bufferedReader.readLine();
                serverCommand = bufferedReader.readLine();
                filePath = bufferedReader.readLine();
                System.out.println("监听到一条信息:IP:" + socket.getInetAddress().getHostAddress() + ",PORT:" + socket.getPort() + "用户名:" + userName);
                switch (serverCommand){
                    case  "nullCommand":
                        System.out.println("没有任何命令");
                        break;
                    case "creative":
                        CreativeFile();
                        break;
                    case "delete":
                        DeleteFile();
                        break;
                    case "upLoad":
                        UpLoad();
                        break;
                    case "downLoad":
                        DownLoad();
                        break;
                    default:
                        System.err.println("未知的命令!");
                        break;
               }
            }
        }catch (IOException e){
            System.out.println("服务器错误!错误信息:" + e);
        }
    }

    public void CreativeFile(){
        file = new File(filePath);
        try {
            if (file.mkdirs()){
                System.out.println("文件夹:" + file.getName() + ",已成功创建");
            }else if (!file.mkdirs()){
                System.err.println("文件创建失败");
            }
        }catch (Exception e){
            System.err.println("服务器文件创建失败!错误信息:" + e);
        }
    }

    public void DeleteFile(){
        file = new File(filePath);
        try {
            if (file.delete()){
                System.out.println("文件夹:" + file.getName() + ",已成功删除");
            }else if (!file.delete()){
                System.err.println("文件删除失败");
            }
        }catch (Exception e){
            System.err.println("服务器文件删除失败!错误信息:" + e);
        }
    }

    public void UpLoad(){

    }

    public void DownLoad(){

    }
}

_第一次报错(内容:文件创建失败/文件删除失败),以后就不报错了,但有问题

我觉得应该是文件创建/删除出问题了 Socket应该,没问题

不报错 按正常的那样就好了

  • 写回答

1条回答 默认 最新

  • 关注

    看看filePath路径是否准确,还有要先判断文件夹是否存在。

    public void CreativeFile(){
            file = new File(filePath);
            try {
                if(!file.exists()){
                    if (file.mkdirs()){
                      System.out.println("文件夹:" + file.getName() + ",已成功创建");
                    }else if (!file.mkdirs()){
                        System.err.println("文件夹创建失败");
                    }
                }else{
                    System.err.println("文件夹已经存在");
                }
            }catch (Exception e){
                System.err.println("服务器文件创建失败!错误信息:" + e);
            }
        }
    
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月3日

悬赏问题

  • ¥15 安卓C读取/dev/fastpipe屏幕像素数据
  • ¥15 pyqt5tools安装失败
  • ¥15 mmdetection
  • ¥15 nginx代理报502的错误
  • ¥100 当AWR1843发送完设置的固定帧后,如何使其再发送第一次的帧
  • ¥15 图示五个参数的模型校正是用什么方法做出来的。如何建立其他模型
  • ¥100 描述一下元器件的基本功能,pcba板的基本原理
  • ¥15 STM32无法向设备写入固件
  • ¥15 使用ESP8266连接阿里云出现问题
  • ¥15 BP神经网络控制倒立摆