基于JAVA Swing,Hibernate,MySQL模拟QQ

本文档介绍了一位研究生使用JAVA Swing、Hibernate和MySQL搭建的一个模拟QQ应用。配置包括Windows 10、Eclipse 4.7.0、Hibernate 5.5和MySQL 5.7。应用包含信息发送器(Senter)、接收器(Accepter)、用户界面(JFrames)和数据交互组件(Inquirer)。此外,还提到了User和Message信息类,以及项目存在的不足,如未优化服务器并发和数据加密等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于JAVA Swing,Hibernate,MySQL模拟QQ

本人目前只是研究生一名,最近比较清闲,就用手头上会的一点工具写了一个模拟QQ的工具;以下的几篇博客就简单的阐述一下实现思路,以及具体的方法和遇到的一些问题;

配置列表 :
Windows 10
Eclipse 4.7.0
Hibernate 5.5
MySQL 5.7

基本框架 :
这里写图片描述

框架组成 :
Senter : 信息的发送器;创建Socket和对象输出流;
Accepter : 信息接收器 ;创建ServerSocket和对象输入流;客户端的Accepter还兼资源池的作用,传入的数据会被分类保存在Accepter的静态代码块中;客户端的其他模块会调用该资源池;
JFrames : 客户端生成模拟QQ的各种面板;
Inquirer : 服务器向MySQL交互,增删改查;

信息类 :
User : 客户基本信息: id,name,tempmsg,password,ip等
Message : 消息基本信息: senter,accepter,msg,id,time;
Integer : 由服务器向客户端发送的确认信息;客户端会根据这些不同的信息作出相应的相应;不同的数值代表不同的含义;

其他注意事项:目前该项目还有一些缺陷;比如没有优化服务器的并发问题;传输的数据没有实现加密等;

好了,下面开始讲具体的实现了:首先是登陆面板:
这里写图片描述

package likeQQ;


import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class LoginPanel extends JFrame{

    private static final long serialVersionUID = 1L;
    private JTextField txtAc = new  JTextField(15);
    private JPasswordField txtPW = new  JPasswordField(15);
    private JButton LoginBtn = new JButton();
    private JButton RegisterBtn = new JButton();
    private ImageIcon icon,registerImg;

    private LoginPanel(){
        setSize(500,300);
        setDefaultCloseOperation(3);
        setLocation(300,30);

        LoginBtn.addActionListener((ActionEvent e)-> this.judgement());
        RegisterBtn.addActionListener((ActionEvent e)-> RegisterPanel.getRegisterPanel());

        txtAc.addKeyListener(new KeyAdapter() {
            public void keyTyped(KeyEvent e) {
                if (e.getKeyChar() == KeyEvent.VK_ENTER)    txtPW.requestFocus();
            }});

        txtPW.addKeyListener(new KeyAdapter() {
            public void keyTyped(KeyEvent e) {
                if (e.getKeyChar() == KeyEvent.VK_ENTER)    judgement();
            }});

        icon = new ImageIcon(this.getClass().getResource("/materials/btn1.png"));
        registerImg = new ImageIcon(this.getClass().getResource("/materials/btn2.png"));

        JPanel jp = new JPanel(){
            protected void paintComponent(Graphics g) {
                try {
                    g.drawImage(ImageIO.read(this.getClass().
                            getResource("/materials/bk.png")), 0, 0, null);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                g.setColor(Color.GRAY);
                g.setFont(new Font("Brush script MT",Font.BOLD,30));
                g.drawString("Account   :",90,100);
                g.drawString("PassWord:",90,130);
            }
        };
        jp.setSize(500,300);
        jp.setLocation(0, 0);
        jp.setLayout(null);
        jp.add(txtAc);
        jp.add(txtPW);
        jp.add(LoginBtn);
        jp.add(RegisterBtn);
        txtAc.setLocation(240, 85);
        txtPW.setLocation(240, 110);
        txtAc.setSize(120,23);
        txtPW.setSize(120,23);
        LoginBtn.setLocation(210,150);
        LoginBtn.setSize(70, 25);
        LoginBtn.setIcon(icon);
        LoginBtn.setOpaque(false);
        LoginBtn.setContentAreaFilled(false);

        RegisterBtn.setLocation(295,150);
        RegisterBtn.setSize(70, 25);
        RegisterBtn.setIcon(registerImg);
        RegisterBtn.setOpaque(false);
        RegisterBtn.setContentAreaFilled(false);

        add(jp);


        setResizable(false);
        setLayout(null);
        setVisible(true);
    }

    private static final LoginPanel loginpanel = new LoginPanel();
    public static LoginPanel getLoginPanel(){
        return loginpanel;
    }

    private void judgement(){
        User localUser = new User();
        if(txtAc.getText()!=null || String.valueOf(txtPW.getPassword())!=null
                ||!"".equals(txtAc.getText())||!"".equals(String.valueOf(txtPW.getPassword()))){
            localUser.setUserName(txtAc.getText());
            localUser.setPassword(String.valueOf(txtPW.getPassword()));
            Senter.getInstance().sent(localUser);
        }
        int count=0;
        while (Acceptor.Feedback==0)
        {
            count++;
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(count>200){
                JOptionPane.showMessageDialog(null,"Network connection timeout...");
                break;
            }
        }
        if(Acceptor.Feedback==1 ){//&& Acceptor.Friendlist!=null
            Acceptor.host = localUser;
            Acceptor.listpanel = ListPanel.getInstance(Acceptor.Friendlist);
            Acceptor.listpanel.setTitle(txtAc.getText());
            this.dispose();
            Acceptor.Feedback=0;
        }
    else if(Acceptor.Feedback==2)
        JOptionPane.showMessageDialog(null,"Login Failed");
        Acceptor.Feedback=0;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值