java在线聊天项目 客户端登陆窗口LoginDialog的登记用户作用

 点击下图注册按钮,出现挂号用户面板,把手提式无线电话机号和判断一致的密码添加到MySQL数据库中

0. 引言

   
 使用工具是人与动物的主旨差别,善用工具得以十分大的提升效能,下落错误率。在PC软件领域,有诸多好用的工具,那些工具都是软件工程第三的基本功设备。可是,嵌入式开发,在其代码数量上,很多时候由于并未这一个不以为奇的框架和库,所以代码量比较小很多,此外嵌入式的运营载体决定了不容许运行大规模的先后,指标文件一般都是kB为单位,即便带操作系统的嵌入式开发,指标代码也常是MB级别。

   
 这几个成分造成众多嵌入式开发者对代码工具不太正视,直接手动管理代码,习惯性的改变2次copy三个本子,几天下来,要不是文本以日期为单位,天天一版可能一天有少数个后缀版本,要不是就协同v1,v2,v3后缀备份…
一段时间备份下来,这一个事物唯有协调可以看懂,可是一旦放下几天,某天又回头要追溯哪个难点时,由于并未改动记录等原因,变得及其困难,本身也看不懂了。固然公司都有服务器,可是关乎到五人付出情形下,服务器交由都尤其慎重,一般的是做出贰个阶段性成果大概二个模块测试之后才往服务器合并。大部分光阴都以本土开发,117日往服务器commit一三回。最后致使本机硬盘急迅消耗,代码照旧很难追述到有些节点,尤其为局地表达和尝试工作而新开的版本,那些尝试其实很有价值,但是最后被多量备份文件淹没了,当硬盘快爆了的时候屡次都以把富有备份全部删掉,项目赶得急,根本无暇顾及那一个有意义的切磋和备份。

   
其实那一个都能够在本机用版本管理软件很好的解决,本文就说说单机版的本子管理。做PC软件的能够绕过,服务器仓库不受地方限定,机器故障可能率基本为零,比单机强多了,做嵌入式的情侣,或入行不深的上学的小孩子和爱好者能够看看本文,终究经验之谈。

澳门美高梅手机网站 1

1.SVN本地版本管理

1.1 下载安装Tortoise SVN

单机版本管理,Tortoise
SVN就丰裕了,如若多个人合营项目,当然就径直利用Visual SVN
了,主要便是布局Visual SVN
Server,都是傻瓜式的设置,不再赘言。(本文只谈谈Windows平台)

1.2  代码管理基础操作

A. 新建代码仓库

壹 、新建文件夹,目录和文书夹名称最好都用英文;

② 、打开文件夹,在空白处按下右键;

③ 、在弹出的菜单中选拔“Tortoise SVN – Create repository here”;

④ 、弹出对话框,提醒成立成功,并自行在文件夹中开创了目录结构;

伍 、在能源文件夹内,右键“Tortoise SVN – Repo
browser”,然后复制代码仓库地址U翼虎L,其实即是当地的文本夹地址加了file://。

 澳门美高梅手机网站 2

B.  导入项目(把品种投入代码库)

一 、打开已某些连串文件夹,在空白处按下鼠标右键;

二 、在弹出的菜单中选择“TortoiseSVN – Import”;

三 、选取导入路径file:///F:/repository,填写备注新闻,点击“OK”开始导入;

四 、导入达成后会弹出提醒,能够查阅导入的文本,点击“OK”,完结导入。

 澳门美高梅手机网站 3

C. 建立办事目录(检出)

一 、新建筑工程作目录文件夹,在空白处按下鼠标右键;

② 、在弹出的菜单中采取“SVN Checkout…”;

叁 、在弹出的对话框中精选库目录、工作目录,点击“OK”先导检出;

肆 、弹出详细新闻对话框,导出落成后,点击“OK”。

能够见见工作目录中多出了版本管理库中的文件,这几个文件正是有版本控制的,对那些文件的修改能够保存到库,也得以从Curry恢复生机旧版本的文书。

 澳门美高梅手机网站 4

 澳门美高梅手机网站 5

貌似的,也能够在此外地点点击右键,在弹出的菜单中选取“SVN
Checkout…”,然后修改检出的公文的保留路径。

 澳门美高梅手机网站 6

D. 更新工作目录

1.对此单机版本管理的话,这几个难题核心得以忽略,除非您在少数个地方做了check
out然后付出了修改。然后某一天你又到了您常用的目录下工作,然后交到修改,但是此时你用的本子现已不是时尚的了。

2.做事前更新文件是1个好习惯,经常在您对工作目录进行修改前,为确定保证你的文本是最新的,须求实行更新操作;

  1. 在办事目录空白处点击鼠标右键,选用“SVN Update”;

4.
会弹出对话框最先更新,并突显更新了什么样内容,库版本是稍稍。上面就是自小编在此外二个目录提交了版本,然后到workSpace目录下,又交给贰遍update。

 澳门美高梅手机网站 7

E.提交工作目录(Commit、check in)

① 、本地目录做了修改,然后需求交给到代码库;

② 、在干活目录内的空白点可能目录上点击鼠标右键,选取“SVN Commit”;

三 、会弹出对话框,可以输入备注音讯,方便以往翻看历史记录。

   
展现将要付出哪些文件,是哪些品种变更,点击“OK”起初交付,比如下图是作者在文书夹内加了add2.txt文书,然后提交突显add类型改动;

肆 、弹出对话框显示提交进程,落成后点击“OK”完结。

 澳门美高梅手机网站 8

若不是新加文书,而是修改了已有文件然后提交,会呈现文件修改。

 澳门美高梅手机网站 9

F.版本回滚

      难题来了,最前面包车型客车引言说的,怎么着退回某二个版本。

澳门美高梅手机网站,   
 1.为了试验特别清楚。大家先交由1遍,做个记录。提交时候的log写为:测试版本回滚v7.

 澳门美高梅手机网站 10

     2.改动文件,提交第三次,log为test changed 1。

 澳门美高梅手机网站 11

 澳门美高梅手机网站 12

   3. 修改文件,提交第2遍。

 澳门美高梅手机网站 13

  4. 本子回滚到v7.

   最近版本9,能够回来版本7。依据版本回滚.

 澳门美高梅手机网站 14

 澳门美高梅手机网站 15

自然,一般的都是根据提交时候的诠释回滚。找到某一版本,然后右键选取Update
item to revision 或然直接Check Out,两者效果是一律的。

 澳门美高梅手机网站 16

 

G. 如何新加一个文件

正如,新建了八个文件。

 澳门美高梅手机网站 17

然后新加文书添加到代码仓库,告诉SVN,那三个兄弟也扶助照顾着。

右键“TortoiseSVN –
add”,弹出对话框选取要添加的文书。若一向在文书上单击右键添加,那么那八个文件会直接助长到版本库,不会付给提醒。

 澳门美高梅手机网站 18

增进成功之后会浅青提醒,表示和版本库不均等,没有同台。提交将来,深黄咋舌号会变成浅莲红钩的标记。

交由以往,那八个公文就在代码仓库有了一个备份,下次check
out时候就会有那多少个文件。

无异于道理,要去除文件也非得commit,让SVN知道不再须要管住这么些文件,下次check
out时候他才不会产出那个文件。

可是,假若依照版本来找,仍是可以在如今版本找到被剔除的文书的,那正是本子管理软件的优势。

 澳门美高梅手机网站 19

若要废除刚才添加的文件,直接revert 即可,和增进的逻辑刚好相反。

澳门美高梅手机网站 20

工作原理:

与单机的软件分化,这几个聊天的登录框不能够把注册消息一贯添加进数据库

而是应当把注册新闻发送到服务器

当服务器收到到注册音信后,在服务端把注册音信添加进数据库


 

先是,做连接数据库的备选

老是数据库要求一个连接数据库的驱动包
—— mysql-connector-java-5.1.7-bin.jar

假使忘记倒入连接mysql数据库的包,汇合世java.lang.ClassNotFoundException:
com.mysql.jdbc.Driver难题

 

下载地址:链接: https://pan.baidu.com/s/1geBRqqn 密码: 8jxm

 

下一场,把连接数据库的讲话做成工具类,方便调用

DBUtil类,负责连接已经存在的数据库sw_database(用DBUtil.getConn()方法)

      负责连接数据库后关门各类财富(用DBUtil.closeAll()方法)

package com.swift.jdbc;

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

public class DBUtil {

    public static Connection getConn() {
        Connection conn=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            String url="jdbc:mysql://localhost:3306/sw_database";
            String user="root";
            String password="root";
            conn=DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    public static void closeAll(Connection conn,PreparedStatement ps,ResultSet rs) {

        if(conn!=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(ps!=null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

 

紧接着,需求把用户注册的消息添加进数据库的sw_user表中

故此,再建一个工具类DBAdd,负责添加用户注册消息到表中(用DBAdd.add(User
user)方法)

 

package com.swift.jdbc;

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

public class DBAdd {

    public static void add(User user) {

        String phone = user.getUsername();
        String password = user.getPassword();

        Connection conn = DBUtil.getConn();
        PreparedStatement ps=null;
        try {
            ps = conn.prepareStatement("insert into sw_user(username,password) values(?,?)");
            ps.setString(1, phone);
            ps.setString(2, password);
            int count = ps.executeUpdate();
            if (count == 1) {
                System.out.println("用户添加成功");
            } else {
                System.out.println("用户添加失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.closeAll(conn, ps, null);
        }

    }

}

User类代码如下:负责用户音信的卷入

package com.swift.jdbc;

public class User {

    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;
    }
    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }
    public User() {
        super();
    }
    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
    }

}

 

进而,在LoginDialog登陆窗口“注册用户”按钮添加监听,当点击按钮则把新闻发送给服务端

音信发给服务端,须求建立与服务端的连日,及倒闭窗口断开连接

连接后各自发送电话号码和认证好的密码

实际代码如下:

package com.swift.frame;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ConnectException;
import java.net.Socket;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.TitledBorder;

import com.swift.jdbc.DBAdd;
import com.swift.jdbc.DBUtil;
import com.swift.jdbc.User;
import com.swift.util.Center;

public class LoginDialog extends JDialog {

    private JPasswordField passwordField_2;
    private JPasswordField passwordField_1;
    private JTextField textField_2;
    private JTextField textField;

    Socket s;
    DataOutputStream dos;
    DataInputStream dis;

    public static void main(String args[]) {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JDialog.setDefaultLookAndFeelDecorated(true);

        try {
            UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        } catch (InstantiationException e1) {
            e1.printStackTrace();
        } catch (IllegalAccessException e1) {
            e1.printStackTrace();
        } catch (UnsupportedLookAndFeelException e1) {
            e1.printStackTrace();
        }

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    LoginDialog dialog = new LoginDialog();
                    dialog.addWindowListener(new WindowAdapter() {
                        public void windowClosing(WindowEvent e) {
                            System.exit(0);
                        }
                    });
                    dialog.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public LoginDialog() {
        super();
        setResizable(false);
        setTitle("在线聊天登录框");
        getContentPane().setLayout(null);
        setBounds(100, 100, 427, 301);// 注册时高度为578,不注册是301

        // 设置窗口居中
        this.setLocation(Center.getPoint(this.getSize()));

        final JButton button_1 = new JButton();
        button_1.setText("登录");
        button_1.setBounds(230, 222, 106, 36);
        getContentPane().add(button_1);

        final JTextField textField_1 = new JTextField();
        textField_1.setBounds(148, 90, 192, 42);
        getContentPane().add(textField_1);

        final JLabel label = new JLabel();
        label.setText("帐    号");
        label.setBounds(76, 102, 66, 18);
        getContentPane().add(label);

        final JLabel label_1 = new JLabel();
        label_1.setText("密    码");
        label_1.setBounds(76, 167, 66, 18);
        getContentPane().add(label_1);

        final JPasswordField passwordField = new JPasswordField();
        passwordField.setBounds(148, 155, 192, 42);
        getContentPane().add(passwordField);

        final JButton button = new JButton();
        button.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                if (LoginDialog.this.getHeight() == 301) {
                    LoginDialog.this.setSize(427, 578);
                } else {
                    LoginDialog.this.setSize(427, 301);
                }
                // 设置窗口不断居中
                LoginDialog.this.setLocation(Center.getPoint(LoginDialog.this.getSize()));
            }
        });
        button.setText("注册");
        button.setBounds(76, 222, 106, 36);
        getContentPane().add(button);

        final JPanel panel = new JPanel();
        panel.setLayout(null);
        panel.setBorder(new TitledBorder(null, "注册用户", TitledBorder.DEFAULT_JUSTIFICATION,
                TitledBorder.DEFAULT_POSITION, null, null));
        panel.setBounds(10, 278, 401, 226);
        getContentPane().add(panel);

        final JLabel label_2 = new JLabel();
        label_2.setBounds(44, 41, 65, 18);
        label_2.setText("手机号:");
        panel.add(label_2);

        textField = new JTextField();
        textField.setBounds(115, 35, 225, 30);
        panel.add(textField);

        final JButton button_2 = new JButton();
        button_2.setText("发送验证");
        button_2.setBounds(243, 75, 97, 30);
        panel.add(button_2);

        textField_2 = new JTextField();
        textField_2.setBounds(115, 104, 95, 30);
        panel.add(textField_2);

        final JLabel label_3 = new JLabel();
        label_3.setText("验证码:");
        label_3.setBounds(44, 110, 65, 18);
        panel.add(label_3);

        passwordField_1 = new JPasswordField();
        passwordField_1.setBounds(115, 143, 231, 30);
        panel.add(passwordField_1);

        passwordField_2 = new JPasswordField();
        passwordField_2.setBounds(115, 175, 231, 30);
        panel.add(passwordField_2);

        final JLabel label_4 = new JLabel();
        label_4.setText("密        码:");
        label_4.setBounds(44, 149, 65, 18);
        panel.add(label_4);

        final JLabel label_5 = new JLabel();
        label_5.setText("验证密码:");
        label_5.setBounds(44, 181, 65, 18);
        panel.add(label_5);

        final JButton button_3 = new JButton();
        button_3.setBounds(47, 510, 97, 30);
        getContentPane().add(button_3);
        button_3.setText("放弃");

        final JButton button_4 = new JButton();
        button_4.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {

                String phone = textField.getText();
                String password = null;
                String str1=new String(passwordField_1.getPassword()).trim();
                String str2=new String(passwordField_2.getPassword()).trim();

                if (str1.equals(str2)) {
                    password = new String(passwordField_2.getPassword()).trim();
                } else {
                    System.out.println("输入密码不一致...");
                    System.exit(0);
                }
                try {
                    dos.writeUTF(phone);
                    dos.writeUTF(password);
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        });

        button_4.setBounds(262, 510, 97, 30);
        getContentPane().add(button_4);
        button_4.setText("注册用户");

        connect();
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosed(WindowEvent e) {
                disconnect();
            }
        });
    }

    public void connect() {
        try {
            s = new Socket("127.0.0.1", 8888);
            System.out.println("一个客户端登陆中....!");
            dos = new DataOutputStream(s.getOutputStream());
            dis = new DataInputStream(s.getInputStream());

        } catch (ConnectException e) {
            System.out.println("服务端异常.........");
            System.out.println("请确认服务端是否开启.........");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void disconnect() {
        try {
            if (dos != null)
                dos.close();
            if (s != null)
                s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


}

服务端要经受客户端登陆窗发来的手提式有线电话机号码和密码

然后将新闻打包成User,通过DBAdd.add(user)添加进数据库

树立叁个LoginServer类,负责接收新闻和添加进数据库

切实代码如下:

package com.swift;


import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;

import com.swift.jdbc.DBAdd;
import com.swift.jdbc.User;

public class LoginServer {

    boolean started = false;
    ServerSocket ss = null;
    Socket s = null;

    public static void main(String[] args) {
        new LoginServer().fun();
    }

    private void fun() {
        try {
            ss = new ServerSocket(8888);
            started = true;
        } catch (BindException e) {
            System.out.println("端口使用中......");
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        try {
            while (started) {
                s = ss.accept();
                System.out.println("a client connected success");
                Client c = new Client(s);
                new Thread(c).start();
            }
        } catch (EOFException e) {
            System.out.println("client has closed.");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                ss.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    class Client implements Runnable {

        private Socket s;
        private DataInputStream dis;
        private DataOutputStream dos;
        private boolean connected = false;

        public Client(Socket s) {
            this.s = s;
            try {
                this.dis = new DataInputStream(s.getInputStream());
                this.dos = new DataOutputStream(s.getOutputStream());
                connected = true;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        @Override
        public void run() {
            try {//注意:要包括while循环,如果try在while循环里,则出现socket closed异常
                while (connected) {
                    String phone = dis.readUTF();
                    String password = dis.readUTF();

                    System.out.println(phone);
                    System.out.println(password);

                    User user=new User(phone,password);
                    DBAdd.add(user);
                }
            } catch(SocketException e) {
                System.out.println("一个登陆窗已经关闭....");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                  if (s != null) {
                      try {
                          s.close();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
                if (dis != null) {
                    try {
                        dis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(dos!=null) {
                    try {
                        dos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

        }

    }
}

效果图:

开拓七个登陆窗口,分别注册用户后关闭,服务端提醒音讯如下:

澳门美高梅手机网站 21

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注