您的位置:首页 > 编程语言 > Java开发

基于JAVA Swing,Hibernate,MySQL模拟QQ

2017-09-18 23:18 330 查看

基于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<
8b99
/span>)
JOptionPane.showMessageDialog(null,"Login Failed");
Acceptor.Feedback=0;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: