zoukankan      html  css  js  c++  java
  • 在线聊天项目1.4版 使用Gson方法解析Json字符串以便重构request和response的各种请求和响应 解决聊天不畅问题 Gson包下载地址

    在线聊天项目结构图:

    多用户登陆效果图:

    多用户聊天效果图:

    数据库效果图:


    重新构建了Server类,使用了Gson方法,通过解析Json字符串,增加Info类,简化判断过程。

    Server类代码如下:

    package com.swift.server;
    
    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 java.util.ArrayList;
    import java.util.List;
    import java.util.Vector;
    
    import com.google.gson.Gson;
    import com.swift.jdbc.DBAdd;
    import com.swift.jdbc.DBLogin;
    import com.swift.other.User;
    import com.swift.util.Info;
    
    public class Server {
    
        boolean started = false;
        ServerSocket ss = null;
        Socket s = null;
        List<Client> clients = new ArrayList<Client>();
        Vector<String> list = new Vector<String>();
    
        public static void main(String[] args) {
            new Server().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);
                    clients.add(c);
                    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 {
    
            public Socket s;
            public DataInputStream dis;
            public 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 (connected) {
                        // 接收客户端请求
                        String json = dis.readUTF();
                        Gson gson = new Gson();
                        Info info = gson.fromJson(json, Info.class);
                        if (info.getState().equals("login")) {
    
                            String phone = info.getPhone();
                            String password = info.getPassword();
                            System.out.println(phone);
                            System.out.println(password);
    
                            User user = new User(phone, password);
                            boolean login = DBLogin.login(user);
                            if (login) {
                                dos.writeUTF("success");
                                dos.flush();
                                String userName = dis.readUTF();
                                // 添加进好友列表Vector
                                list.addElement(userName);
    
                                System.out.println();
                                // 每当有成功登陆就向各个客户端发送完整列表
                                for (int i = 0; i < clients.size(); i++) {
                                    Client c = clients.get(i);
                                    System.out.println(c.s.getPort());
                                    for (int j = 0; j < list.size(); j++) {
                                        String name = list.get(j);
                                        System.out.println(name);
                                        String json_name = "{"state":"friends","msg":"" + name + ""}";
                                        c.send(json_name);
                                    }
                                }
    
                            } else {
                                dos.writeUTF("fail");
                                dos.flush();
                            }
    
                        } else if (info.getState().equals("reg")) {
                            String phone = info.getPhone();
                            String password = info.getPassword();
                            System.out.println(phone);
                            System.out.println(password);
    
                            User user = new User(phone, password);
                            boolean flag = DBAdd.add(user);
                            if (flag) {
                                dos.writeUTF("success");
                            }else {
                                dos.writeUTF("fail");
                            }
                        } else if (info.getState().equals("chat")) {
                            System.out.println(json);
                            for (int i = 0; i < clients.size(); i++) {
                                Client c = clients.get(i);
                                c.send(json);
                            }
                        }
    
                    }
                } catch (SocketException e) {
                    System.out.println("一个登陆窗已经关闭....");
                } catch (EOFException e) {
                    System.out.println("a client has been closed,can't read message from it.");
                } 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();
                        }
                    }
                }
            }
    
            private void send(String str) {
                try {
                    this.dos.writeUTF(str);
                    this.dos.flush();
                } catch (SocketException e) {
                    clients.remove(this);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
        }
    }

    新增的工具类Info,通过info对象的get方法把获得服务端得到的各种字符串直接归类了。

    Info类代码如下:

    package com.swift.util;
    
    public class Info {
        private String state;
        private String msg;
        private String phone;
        private String password;
        public String getPhone() {
            return phone;
        }
        public void setPhone(String phone) {
            this.phone = phone;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getState() {
            return state;
        }
        public void setState(String state) {
            this.state = state;
        }
        public String getMsg() {
            return msg;
        }
        public void setMsg(String msg) {
            this.msg = msg;
        }
        
    }

    重构了登陆窗口的登陆和注册请求

    登陆窗口的代码如下:

    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 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.util.Center;
    
    public class LoginDialog extends JDialog {
    
        private static final long serialVersionUID = 1L;
        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 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_1 = new JButton();
            button_1.addActionListener(new ActionListener() {
                public void actionPerformed(final ActionEvent e) {
    
                    String phone = new String(textField_1.getText()).trim();
                    String password = new String(passwordField.getPassword()).trim();
                    if (!phone.equals("") && !password.equals("")) {
                        try {
                            String json_login = "{"state":"login","phone":"" + phone + "","password":""
                                    + password + ""}";
                            dos.writeUTF(json_login);
                            dos.flush();
                            String flag = dis.readUTF();
                            if (flag.equals("success")) {
                                javax.swing.JOptionPane.showMessageDialog(LoginDialog.this, "登录成功");
                                // 把登陆成功的用户发送给服务端,作为好友列表信息
                                dos.writeUTF(phone);
                                dos.flush();
                                // 登陆窗消失
                                LoginDialog.this.dispose();
                                // 好友列表窗出现
                                new FriendsFrame(phone, s);
    
                            } else if (flag.equals("fail")) {
                                javax.swing.JOptionPane.showMessageDialog(LoginDialog.this, "登录失败");
                            }
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }
                    } else {
                        javax.swing.JOptionPane.showMessageDialog(LoginDialog.this, "用户名密码必须填写...");
                        return;
                    }
                }
            });
            button_1.setText("登录");
            button_1.setBounds(230, 222, 106, 36);
            getContentPane().add(button_1);
    
            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 (!phone.equals("") && !str1.equals("") && !str2.equals("")) {
                        if (str1.equals(str2)) {
                            password = new String(passwordField_2.getPassword()).trim();
                            try {
                                String json_reg = "{"state":"reg","phone":"" + phone + "","password":""
                                        + password + ""}";
                                dos.writeUTF(json_reg);
                                dos.flush();
                                String flag = dis.readUTF();
                                if (flag.equals("success")) {
                                    javax.swing.JOptionPane.showMessageDialog(LoginDialog.this, "注册成功...");
                                    textField.setText("");
                                    passwordField_1.setText("");
                                    passwordField_2.setText("");
                                } else {
                                    javax.swing.JOptionPane.showMessageDialog(LoginDialog.this, "注册失败...");
                                }
                            } catch (IOException e1) {
                                e1.printStackTrace();
                            }
                        } else {
                            javax.swing.JOptionPane.showMessageDialog(LoginDialog.this, "输入密码不一致...");
                            System.out.println("输入密码不一致...");
                            passwordField_1.setText("");
                            passwordField_2.setText("");
                        }
    
                    } else {
                        javax.swing.JOptionPane.showMessageDialog(LoginDialog.this, "用户名密码必须填写...");
                        return;
                    }
                }
            });
    
            button_4.setBounds(262, 510, 97, 30);
            getContentPane().add(button_4);
            button_4.setText("注册用户");
    
            connect();
    
        }
    
        public void connect() {
            try {
                s = new Socket("127.0.0.1", 8888);// 以本机做server
                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();
            }
        }
    
    }

    对好友列表窗的死循环傻傻等待服务端信息,进行了重构,通过Gson方法自动判断所获得的Json串信息到底是好友的更新还是聊天信息的更新。

    好友列表窗代码如下:

    package com.swift.frame;
    
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    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.Socket;
    import java.net.SocketException;
    import java.util.Vector;
    
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
    import javax.swing.JTabbedPane;
    import javax.swing.SwingConstants;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    import com.google.gson.Gson;
    import com.google.gson.JsonObject;
    import com.swift.util.Info;
    
    public class FriendsFrame extends JFrame {
    
        private static final long serialVersionUID = 1L;
        private Socket s;
        private DataOutputStream dos;
        private DataInputStream dis;
        private boolean connected = false;
        Vector<String> names = new Vector<String>();
        JList<String> list = null;
    
        public FriendsFrame(String name, Socket socket) {
            super("欢迎 " + ":" + socket.getLocalPort());
            this.s = socket;
            connected = true;
            names.add("登录用户");
            try {
                this.dos = new DataOutputStream(s.getOutputStream());
                this.dis = new DataInputStream(s.getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
            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();
            }
    
            setBounds(100, 100, 247, 581);
            setVisible(true);
            final JPanel panel = new JPanel();
            panel.setLayout(new BorderLayout());
            getContentPane().add(panel, BorderLayout.NORTH);
    
            final JLabel label = new JLabel(new ImageIcon("Images/logo.jpg"));
            label.setText("New JLabel");
            panel.add(label, BorderLayout.WEST);
            label.setPreferredSize(new Dimension(74, 74));
    
            final JPanel panel_1 = new JPanel();
            panel_1.setLayout(new BorderLayout());
            panel.add(panel_1, BorderLayout.CENTER);
    
            final JLabel advancingSwiftLabel = new JLabel();
            advancingSwiftLabel.setText(name);
            panel_1.add(advancingSwiftLabel, BorderLayout.CENTER);
    
            final JLabel neverWasterLabel = new JLabel();
            neverWasterLabel.setText("Never waste time any more");
            panel_1.add(neverWasterLabel, BorderLayout.SOUTH);
    
            final JPanel panel_2 = new JPanel();
            panel_2.setLayout(new BorderLayout());
            getContentPane().add(panel_2, BorderLayout.SOUTH);
    
            final JPanel panel_3 = new JPanel();
            final FlowLayout flowLayout = new FlowLayout();
            flowLayout.setAlignment(FlowLayout.LEFT);
            panel_3.setLayout(flowLayout);
            panel_2.add(panel_3);
    
            final JButton button = new JButton();
            panel_3.add(button);
            button.setHorizontalTextPosition(SwingConstants.LEFT);
            button.setHorizontalAlignment(SwingConstants.LEFT);
            button.setText("设置");
    
            final JButton button_1 = new JButton();
            panel_3.add(button_1);
            button_1.setText("查找");
    
            final JPanel panel_4 = new JPanel();
            panel_2.add(panel_4, BorderLayout.EAST);
    
            final JButton button_2 = new JButton();
            panel_4.add(button_2);
            button_2.setText("退出");
    
            final JTabbedPane tabbedPane = new JTabbedPane();
            getContentPane().add(tabbedPane, BorderLayout.CENTER);
    
            final JPanel panel_5 = new JPanel();
            tabbedPane.addTab("好友列表", null, panel_5, null);
            list = new JList<String>();
    
            panel_5.add(list);
    
            final JPanel panel_6 = new JPanel();
            tabbedPane.addTab("群聊", null, panel_6, null);
    
            final JPanel panel_7 = new JPanel();
            tabbedPane.addTab("聊天记录", null, panel_7, null);
    
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    
            final JMenuBar menuBar = new JMenuBar();
            setJMenuBar(menuBar);
    
            final JMenu menu = new JMenu();
            menu.setText("操作");
            menuBar.add(menu);
    
            final JMenuItem newItemMenuItem = new JMenuItem();
            newItemMenuItem.setText("设置");
            menu.add(newItemMenuItem);
    
            final JMenuItem newItemMenuItem_1 = new JMenuItem();
            newItemMenuItem_1.setText("空间");
            menu.add(newItemMenuItem_1);
    
            final JMenuItem newItemMenuItem_2 = new JMenuItem();
            newItemMenuItem_2.setText("邮箱");
            menu.add(newItemMenuItem_2);
    
            final JMenu menu_1 = new JMenu();
            menu_1.setText("会员");
            menu.add(menu_1);
    
            final JMenuItem newItemMenuItem_3 = new JMenuItem();
            newItemMenuItem_3.setText("会员官网");
            menu_1.add(newItemMenuItem_3);
    
            final JMenuItem newItemMenuItem_4 = new JMenuItem();
            newItemMenuItem_4.setText("会员专区");
            menu_1.add(newItemMenuItem_4);
    
            menu.addSeparator();
    
            final JMenu menu_2 = new JMenu();
            menu_2.setText("安全");
            menu.add(menu_2);
    
            final JMenuItem newItemMenuItem_5 = new JMenuItem();
            newItemMenuItem_5.setText("紧急冻结");
            menu_2.add(newItemMenuItem_5);
    
            final JMenuItem newItemMenuItem_6 = new JMenuItem();
            newItemMenuItem_6.setText("密码保护");
            menu_2.add(newItemMenuItem_6);
    
            final JMenuItem newItemMenuItem_7 = new JMenuItem();
            newItemMenuItem_7.setText("退出");
            menu.add(newItemMenuItem_7);
            final FlowLayout flowLayout_1 = new FlowLayout();
            flowLayout_1.setAlignment(FlowLayout.RIGHT);
    
            this.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    disconnect();
                    System.exit(0);
                }
            });
    
            // 调用傻傻的等待接收列表信息
            new Thread(new WaitingReceive()).start();
            // 双击激活聊天对话框
            list.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (e.getClickCount() == 2) {
                        new ChatFrame(s);
                    }
                }
            });
    
        }
    
        public void disconnect() {
            try {
                if (dos != null)
                    dos.close();
                if (dis != null)
                    dis.close();
                if (s != null)
                    s.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        class WaitingReceive implements Runnable {
    
            @Override
            public void run() {
                try {
                    while (connected) {
                        String json = dis.readUTF();
                        Gson gson = new Gson();
                        Info info = gson.fromJson(json, Info.class);
                        System.out.println(json + "~~~~~~~~~~~~~~~~~~~~~~~~");
                        if (info.getState().equals("friends")) {
                            int flag = 0;
                            for (int i = 0; i < names.size(); i++) {
                                if (info.getMsg().equals(names.get(i))) {
                                    flag = 1;
                                }
                            }
                            if (flag == 0) {
                                names.add(info.getMsg());
                            }
                            list.setListData(names);
                        }
                        if(info.getState().equals("chat")) {
                            ChatFrame.showTa(info.getMsg());
                            
                            System.out.println(info.getMsg());
                        }
                        
                    }
                } catch (SocketException e) {
                    System.out.println("a client has been closed!");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * WindowBuilder generated method.<br>
         * Please don't remove this method or its invocations.<br>
         * It used by WindowBuilder to associate the {@link javax.swing.JPopupMenu} with
         * parent.
         */
        private static void addPopup(Component component, final JPopupMenu popup) {
            component.addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent e) {
                    if (e.isPopupTrigger())
                        showMenu(e);
                }
    
                public void mouseReleased(MouseEvent e) {
                    if (e.isPopupTrigger())
                        showMenu(e);
                }
    
                private void showMenu(MouseEvent e) {
                    popup.show(e.getComponent(), e.getX(), e.getY());
                }
            });
        }
    }

    对聊天窗异常进行了处理,发现聊天窗与好友列表窗同时傻傻等待服务端信息,会引发冲突,聊天窗后于好友窗打开所以接不到任何信息。

    所以将聊天窗的死循环去掉,而增加一个static静态方法showTa()用来在聊天窗之外供好友窗通过类名.(点)的方式调用,以改变ta(textArea)中的内容。

    聊天窗代码如下:

    package com.swift.frame;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    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 javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    
    public class ChatFrame extends JFrame {
    
        private static final long serialVersionUID = -118470059355655240L;
        private Socket s;
        private DataOutputStream dos;
        private DataInputStream dis;
        private boolean connected = false;
        JLabel label_shang = new JLabel();
        JLabel label_xia = new JLabel();
        JTextField tf = new JTextField(38);
        public static JTextArea ta = new JTextArea(15, 45);
        JButton button = new JButton();
        String tfText1 = null;
    
        public ChatFrame(Socket socket) {
            setBounds(200, 200, 500, 400);
            setTitle("客户端聊天工具 —— 1.4");
            // 对窗口进行大的布局,分为三行一列,在pBasic面板上添加三个面板shang zhong xia
            JPanel pBasic = new JPanel();
            pBasic.setLayout(new BorderLayout());// 不设置默认也是这种布局模式
            setContentPane(pBasic);// 把面板放在窗口上,不记得用this.关键字
            JPanel shang = new JPanel();
            JPanel zhong = new JPanel();
            JPanel xia = new JPanel();
            // 设置JPanel面板的大小
            shang.setSize(470, 25);
            zhong.setSize(470, 180);
            xia.setSize(470, 40);
            pBasic.add(shang, BorderLayout.NORTH);
            pBasic.add(zhong, BorderLayout.CENTER);
            pBasic.add(xia, BorderLayout.SOUTH);
            shang.setBackground(Color.red);
            zhong.setBackground(Color.yellow);
            xia.setBackground(Color.blue);
    
            label_shang.setText("聊天记录");
            shang.add(label_shang);
            ta.setLineWrap(true);// 自动换行
            JScrollPane scroll = new JScrollPane(ta);// 增加滚动条,以便不增加行数
            zhong.add(scroll);
            label_xia.setText("输入信息");
            xia.add(label_xia, BorderLayout.WEST);
            /*
             * 增加功能,窗口监听事件,窗口打开时设置光标焦点在tf文本域中
             */
            this.addWindowListener(new WindowAdapter() {
                @Override
                public void windowOpened(WindowEvent e) {
                    tf.requestFocus();
                }
            });
            xia.add(tf, BorderLayout.CENTER);
            button.setText("发送");
            xia.add(button, BorderLayout.EAST);
    
            button.addActionListener(new MyListener());
            tf.addActionListener(new MyListener());
            pack();
    
            setVisible(true);
            // 创建窗体直接调用连接服务器
            this.s = socket;
            connected = true;
            try {
                dos = new DataOutputStream(s.getOutputStream());
                dis = new DataInputStream(s.getInputStream());
            } catch (ConnectException e) {
                System.out.println("服务端异常.........");
                System.out.println("请确认服务端是否开启.........");
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            
        }
    
        class MyListener implements ActionListener {
    
            @Override
            public void actionPerformed(ActionEvent e) {
                tfText1 = tf.getText();
                tf.setText("");
                // 当回车或发送按钮时,tfText发送到服务器
                String json_chat = "{"state":"chat","msg":"" + tfText1 + ""}";
                try {
                    dos.writeUTF(json_chat);
                    dos.flush();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        }
    
        public static void showTa(String msg) {
            ta.setText(ta.getText()+msg+ "
    ");
        }
    
    }

    对数据库添加的类,DBAdd增加了布尔类型返回值,调用时方便判断是否注册成功

    代码如下:

    package com.swift.jdbc;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    import com.swift.other.User;
    
    public class DBAdd {
        
        public static boolean 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) {
                    return true;
                } 
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                DBUtil.closeAll(conn, ps, null);
            }
            return false;
            
        }
    
    }

    DBLogin,登陆的数据库没有改动

    代码如下:

    package com.swift.jdbc;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import com.swift.other.User;
    
    public class DBLogin {
    
        public static boolean login(User user) {
            
            Connection conn=DBUtil.getConn();
            PreparedStatement ps=null;
            ResultSet rs=null;
            try {
                ps=conn.prepareStatement("select * from sw_user where username=? and password=?");
                ps.setString(1, user.getUsername());
                ps.setString(2, user.getPassword());
                rs=ps.executeQuery();
                if(rs.next()) {
                    return true;
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            DBUtil.closeAll(conn, ps, rs);
            return false;
        }
    }

    连接数据库的工具类DBUtil没有改变

    代码如下:

    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();
                }
            }
        }
    }

    User类没有改变

    package com.swift.other;
    
    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 + "]";
        }
        
    }

    居中的工具类Center没有改变

    package com.swift.util;
    
    import java.awt.Dimension;
    import java.awt.Point;
    import java.awt.Toolkit;
    
    public class Center {
        public static Point getPoint(int width,int height) {
            Toolkit toolkit=Toolkit.getDefaultToolkit();//应该是单例
            int screenW=toolkit.getScreenSize().width;
            int screenH=toolkit.getScreenSize().height;
            int x=(screenW-width)/2;
            int y=(screenH-height)/2;
            Point p=new Point(x,y);
            return p;
        }
        //函数的重载,参数是包装类尺寸——Dimension
        public static Point getPoint(Dimension d) {
            Point p=getPoint(d.width,d.height);
            return p;
        }
    }

    Gson包下载地址

     链接: https://pan.baidu.com/s/1nuG00dj 密码: x88h

  • 相关阅读:
    java 无符号byte转换
    MySQL分区总结
    eclipse @override注解出错
    git 利用hook 实现服务器自动更新代码
    Centos 安装mysql
    Centos Python3安装共存
    chromedriver 代理设置(账号密码)
    PyQt5整体介绍
    python图片云
    PyPt5 浏览器实例
  • 原文地址:https://www.cnblogs.com/qingyundian/p/8100363.html
Copyright © 2011-2022 走看看