为了账号安全,请及时绑定邮箱和手机立即绑定

java socket练习题,实现注册,登录和上传文件

标签:
Java

做的比较粗糙,只是简单实现了这三个功能。创建项目的时候一定要记得导入MySql的jar包并且要将mysql服务启动

package socket;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBHelper {
    private static String Driver = "com.mysql.jdbc.Driver";
    private static String URL = "jdbc:mysql://localhost:3306/test";
    //用户名和密码填自己的
        private static String NAME = "";
    private static String PASSWORD = "";

    private static Connection conn = null;
    static {
        try {
            Class.forName(Driver);
            conn = DriverManager.getConnection(URL,NAME,PASSWORD);
            } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
                e.printStackTrace();
            }               
    }

    public static Connection getConnetion() {
        return conn;
    }
}
package socket;

import java.io.Serializable;

public class Users implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int id;
    private String username;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Users [username=" + username + ", password=" + password + "]";
    }
}
package socket;

import java.io.Serializable;

public class FileUp implements Serializable{
    /**
     *需要实现序列化
     *文件内容以byte类型进行传递 
     */
    private static final long serialVersionUID = 1L;
    private int id;
    private String filename;
    private byte[] fileContent;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

    public byte[] getFileContent() {
        return fileContent;
    }

    public void setFileContent(byte[] fileContent) {
        this.fileContent = fileContent;
    }

}
package socket;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDAO {
    public boolean insert(Users user)  {
        Connection con = DBHelper.getConnetion();
        String sql = "INSERT INTO tusers(username,password) VALUES(?,?)";
        PreparedStatement ps;   
        try {
            ps = con.prepareStatement(sql);
            ps.setString(1, user.getUsername());
            ps.setString(2, user.getPassword());
            ps.execute();
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    public boolean checkUser(Users user) {
        Connection con = DBHelper.getConnetion();
        String sql = "SELECT * FROM tusers WHERE username=? AND password=?";
        PreparedStatement ps = null;
        ResultSet rs = null;
        boolean flag = false;
        try {
            ps = con.prepareStatement(sql);
            ps.setString(1, user.getUsername());
            ps.setString(2, user.getPassword());
            rs = ps.executeQuery();
            if(rs.next()) {
                flag = true;
            }
            else {
                flag = false;
            }
        } catch (SQLException e) {          
            e.printStackTrace();
        }finally {

        }
        return flag;

    }
}
package socket;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class FileDAO {
    public boolean insert(FileUp file) {
        Connection con = DBHelper.getConnetion();

        String sql = "INSERT INTO tfiles(fname,fcontent) VALUES (?,?)";
        PreparedStatement ps;
        try {
            ps = con.prepareStatement(sql);
            ps.setString(1, file.getFilename());
            /**
             * 文件内容在数据库中保存格式为blob,保存文件内容时使用setBytes()方法
             */
            ps.setBytes(2, file.getFileContent());
            ps.execute();           
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}
package socket;
import java.io.Serializable;

public class CommandTransfer implements Serializable{
    /**
     * cmd为用户动作,如reg,login
     * obj为封装的内容,比如user和file类
     * flag为服务器返回的操作状态,true为成功,false为失败
     */
    private static final long serialVersionUID = 1L;
    private String cmd;
    private Object obj;
    private boolean flag;
    public String getCmd() {
        return cmd;
    }
    public void setCmd(String cmd) {
        this.cmd = cmd;
    }
    public Object getObj() {
        return obj;
    }
    public void setObj(Object obj) {
        this.obj = obj;
    }
    public boolean isFlag() {
        return flag;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }
    public static long getSerialversionuid() {
        return serialVersionUID;
    }   
}
package socket;

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

public class Server{

    public static void main(String[] args) {
        try {
            ServerSocket server = new ServerSocket(12345);
            System.out.println("server started...");            
            while(true) {
                System.out.println("waiting for client");
                Socket socket = server.accept();

                Runnable st  = new ServerThread(socket);
                Thread t = new Thread(st);
                t.start();
            }           
        } catch (IOException e) {
            e.printStackTrace();
        }       
    }
}
package socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;

public class ServerThread implements Runnable{
    private Socket socket ;
    private Users user;
    private FileUp file;
    ServerThread(Socket socket){
        this.socket = socket;
    }   
    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            ObjectInputStream ois = new ObjectInputStream(is);
            //对传递过来的transfer对象执行反序列化操作
            CommandTransfer transfer = (CommandTransfer)ois.readObject();
            doCommand(transfer);
            toClient(transfer);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        finally {           
        }       
    }

    /**
     * 执行注册,登录,上传文件操作
     */
    public CommandTransfer doCommand(CommandTransfer transfer) {
        UserDAO udao = new UserDAO();
        FileDAO fdao = new FileDAO();       
        String cmd = transfer.getCmd();
        boolean flag = false;
        //判断用户当前操作是什么
        switch(cmd){
            case "reg":
                user = (Users)transfer.getObj();
                //先查询是否存在该用户,如果不存在再执行插入语句,否则返回false
                if(!udao.checkUser(user)) {
                    flag = udao.insert(user);
                }else {
                    flag = false;
                }
                break;
            case "login":
                user = (Users)transfer.getObj();
                flag = udao.checkUser(user);
                break;
            case "upload":
                //文件上传
                file = (FileUp)transfer.getObj();
                flag = fdao.insert(file);
                break;
        }
        transfer.setFlag(flag);
        return transfer;
    }

    /**
     * 向客户端发送执行结果
     * @param transfer
     */
    public void toClient(CommandTransfer transfer) {
        OutputStream os = null;
        ObjectOutputStream oos = null;
        try {
            os = socket.getOutputStream();
            oos = new ObjectOutputStream(os);
            oos.writeObject(transfer);
            oos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {                   
        }
    }
}
package socket.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

import socket.CommandTransfer;
import socket.FileUp;
import socket.Users;
/**
 * 客户端
 */
public class UserAction {
    private static Scanner scan= new Scanner(System.in);
    private static Users user;
    private Socket socket = null;   
    private static FileUp fileUp;   

    public static void main(String[] args) {

        UserAction action = new UserAction();
        action.showUI();

    }

    public void showUI() {
        System.out.println("你好,请选择:");
        System.out.println("1:注册");
        System.out.println("2:登录");
        System.out.println("3:退出");
        try {
            choice();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }       
    public void choice() throws UnknownHostException, IOException {
        int choice = scan.nextInt();
        /**
         * 使用nextLine()方法解决在nextInt()后其它方法的nextLine()会接收"\n"的问题
         * 如果注释掉nextLine(),比如先输入1,那么reg()方法中if((username =scan.nextLine()).trim().isEmpty())这句就会自动被执行一次     
         */
        scan.nextLine();
        switch(choice) {
        case 1:         
            reg();
            break;
        case 2:         
            login();
            break;
        case 3:
            System.exit(0);
            break;
        default:
            System.out.println("输入无效,请重新输入");           
            choice();       
        }
    }
    public void reg() throws UnknownHostException, IOException {    
        CommandTransfer transfer = new CommandTransfer();
        //设置操作为注册reg
        transfer.setCmd("reg");
        System.out.println("请输入用户名");
        String username =null;
        String password =null;
        //判断输入是否为空,如果为空则回调reg()
        //使用trim()方法去掉空格
        if((username =scan.nextLine()).trim().isEmpty()) {          
                System.out.println("用户名不能为空,请重新输入");
                reg();          
        }else {
            System.out.println("请输入密码");
            if((password=scan.nextLine()).trim().isEmpty()) {
                System.out.println("密码不能为空,请重新输入");                 
                reg();
            }else {
                System.out.println("请确认密码");
                String password2;
                //判断确认密码是否为空以及两次输入是否相等
                if((password2 =scan.nextLine()).trim().isEmpty()||!password.equals(password2)) {
                    System.out.println("两次输入的密码不一样,请重新注册");
                    reg();
                }else {
                    //封装user对象
                    user = new Users();
                    user.setUsername(username);
                    user.setPassword(password);
                    transfer.setObj(user);
                    socket = new Socket("localhost",12345);
                    //向服务器发送transfer对象
                    outToServer(transfer);
                    //获取服务器执行结果
                    transfer = getFromServer();
                    if(transfer.isFlag()) {
                        System.out.println("注册成功,请登录");
                        login();
                    }
                    else {
                        System.out.println("注册失败,请重新注册");
                        reg();
                    }
                    System.out.println(user.getUsername()+user.getPassword());
                }
            }           
        }       
    }

    public void login() throws UnknownHostException, IOException {          
        CommandTransfer transfer = new CommandTransfer();
        //设置操作为登录login
        transfer.setCmd("login");
        System.out.println("请输入用户名");
        String username =null;
        String password =null;
        if((username =scan.nextLine()).trim().isEmpty()) {          
            System.out.println("用户名不能为空,请重新输入");
            login();            
        }else {
            System.out.println("请输入密码");
            if((password=scan.nextLine()).trim().isEmpty()) {
                System.out.println("密码不能为空,请重新输入");                 
                login();
            }
            else {
                user = new Users();
                user.setUsername(username);
                user.setPassword(password);
                transfer.setObj(user);
                socket = new Socket("localhost",12345);
                outToServer(transfer);
                transfer = getFromServer();
                if(transfer.isFlag()) {
                    //登录成功之后提示用户上传文件
                    System.out.println("登录成功,可以上传文件了");
                    upFile();
                }
                else {
                    System.out.println("登录失败,请检查用户名或密码");
                    login();
                }
            }
        }       
    }
    /**
     * 上传文件
     */
    public void upFile()  {
        fileUp = new FileUp();
        CommandTransfer transfer = new CommandTransfer();
        //设置操作为上传文件upload
        transfer.setCmd("upload");
        System.out.println("请输入上传文件的路径,格式如D:/123.txt");
        String path = scan.nextLine();
        File file = new File(path);
        //获取文件名
        String filename = file.getName();
        if(!file.exists()) {
            System.out.println("文件不存在,请重新输入");
            upFile();
        }
        if(!file.isFile()) {
            System.out.println("你所选择的不是文件,请重新输入");
            upFile();
        }

        try {
            FileInputStream fis = new FileInputStream(path);
            //使用fis.available()可以获取文件的大小
            byte[] content = new byte[fis.available()]; 
            //读取文件
            while(fis.read(content,0,content.length)!=-1) {
                fileUp.setFilename(filename);
                fileUp.setFileContent(content);
                transfer.setObj(fileUp);
            }
            socket = new Socket("localhost",12345);
            outToServer(transfer);
            transfer = getFromServer();
            fis.close();
            if(transfer.isFlag()) {
                //上传成功后客户端就停止运行了
                System.out.println("文件上传成功!");              
            }
            else {
                System.out.println("文件上传失败,请检查文件名");
                upFile();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

        /**
         * 向服务器发送transfer对象
         * @param transfer
         * @throws IOException
         */
    public void outToServer(CommandTransfer transfer) throws IOException  {
        OutputStream os = socket.getOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(os);
        oos.writeObject(transfer);
        oos.flush();

    }

    /**
     * 获取服务器发送的信息,其实就一个flag
     */
    public CommandTransfer getFromServer() throws UnknownHostException, IOException {   
        InputStream is;
        ObjectInputStream ois;
        CommandTransfer transfer = null;
        try {           
            is = socket.getInputStream();
            ois = new ObjectInputStream(is);
            //需要强制类型转换
            transfer = (CommandTransfer)ois.readObject();

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //返回一个transfer对象,让其它方法调用里面的isFlag()方法来判断是否执行成功
        return transfer;        
    }
}

运行结果,注册忘截图了,难得再运行了数据库中保存的文件内容数据表结构

点击查看更多内容
23人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
软件工程师
手记
粉丝
0
获赞与收藏
52

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消