package server.serverMain;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.jws.Oneway;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import common.message.node_info;
import common.message.node_public;
import common.message.testMessage;
import server.thread.addFriendsThread.addFriendsThread;
import server.thread.addFriendsThread.authenticationMessageReceiverThread;
import server.thread.addFriendsThread.receiveAgreeRefuseThread;
import server.thread.addqqCanUseThread.addqqCanUseThread;
import server.thread.applicateThread.applicateServerThread;
import server.thread.deleteFridendsThread.deleteFriendsThread;
import server.thread.getAnotherQQIpThread.getAnotherQQIpThread;
import server.thread.getInfoThread.getInfoThread;
import server.thread.groupDealThread.groupDealThread;
import server.thread.heartbeatThread.heartbeatReceiver;
import server.thread.heartbeatThread.judgeAliveThread;
import server.thread.loginThread.loginServerThread;
import server.thread.moveFriendThread.moveFriendThread;
import server.thread.safeThread.judgeWhetherQuestionExistThread;
import server.thread.safeThread.receiveSafeAnswerThread;
import server.thread.safeThread.setSafeQuestionThread;
import server.thread.safeThread.updatePasswordThread;
import server.thread.searchThread.searchThread;
import server.thread.systemMessageThread.sendSystemMessageThread;
import server.thread.systemSettingsThread.systemSettingThread;
import server.thread.updatePersonalInfoThread.updatePersonalInfoThread;
import server.thread.updateRemarkThread.updateRemarkThead;
public class serverMain
extends JFrame
{
JLabel jlable_setLimit
= null;
JLabel jlable_setDatabase
= null;
MyTableModel myModel = null;
addqqCanUseThread addCanUse;
heartbeatReceiver heartbeat;
judgeAliveThread judgeAlive;
loginServerThread loginServer;
applicateServerThread applicateServer;
searchThread searchServer;
addFriendsThread addServer;
authenticationMessageReceiverThread authenticationReceiveServer;
receiveAgreeRefuseThread agreeRefuseServer;
deleteFriendsThread deleteServer;
getAnotherQQIpThread getIpServer;
getInfoThread getInfoServer;
judgeWhetherQuestionExistThread getPasswordServer;
receiveSafeAnswerThread receiverAnswerServer;
groupDealThread groupDealServer;
moveFriendThread moveFriendServer;
setSafeQuestionThread safeQuestionServer;
systemSettingThread systemSettingServer;
updatePasswordThread updatePasswordServer;
updatePersonalInfoThread updatepersonalServer;
updateRemarkThead updateRemarkServer;
public static int limit = 100; // 申请次数限制
public static HashMap
<String, node_public
> map_onlineInfo
= new HashMap
<String, node_public
>();
public static HashMap
<String, Integer
> map_IsSysMessageExist
= new HashMap
<String, Integer
>();
public static HashMap
<String, Date
> map_date
= new HashMap
<String, Date
>();
public static HashMap
<String, Integer
> map_status
= new HashMap
<String, Integer
>();
public static HashMap
<String, String
> map_array_passwordMap
= new HashMap
<String, String
>();
public static ArrayList<String> array_qqCanUse = new ArrayList<String>();
public static int databaseFlag = 0; // 0是mysql 1是SQLServer 默认mysql
public static int startFlag = 0;
private String ip
= "localhost";
private int connectException = 0; // 连接正确与否 1、正确 2、错误
public serverMain()
{
createUserInterface();
try
{
startServer();
}
{
JOptionPane.
showMessageDialog(null,
"服务器启动失败,请查看其是否已经在运行!",
"失败",
}
}
{}
private void createUserInterface()
{
contentPane.
setBackground(Color.
WHITE);
contentPane.setLayout(null);
//
//
// 系统消息
j1.setLayout(null);
//
jlable1
= new JLabel("已发送的系统消息:");
jlable1.
setFont(new Font("宋体",
Font.
PLAIN,
12));
jlable1.setBounds(0, 0, 120, 15);
j1.add(jlable1);
//
//
textPane0.setEditable(false);
textPane0.
setFont(new Font("宋体",
Font.
PLAIN,
12));
textPane0.
setDisabledTextColor(Color.
red);
textPane0.setBounds(0, 20, 600, 180);
j1.add(textPane0);
jsroll0.setBounds(0, 20, 590, 180);
jsroll0.
setVerticalScrollBarPolicy(JScrollPane.
VERTICAL_SCROLLBAR_AS_NEEDED);
j1.add(jsroll0);
//
//
jlable2
= new JLabel("请在下面输入系统消息,按ctrl+enter发送:");
jlable2.setBounds(0, 200, 250, 15);
jlable2.
setFont(new Font("宋体",
Font.
PLAIN,
12));
j1.add(jlable2);
//
jb1.setBounds(470, 202, 100, 15);
jb1.
setFont(new Font("宋体",
Font.
PLAIN,
12));
j1.add(jb1);
@Override
{
jb1ActionPerfromed(e);
}
});
//
textPane1.setBounds(0, 220, 600, 80);
textPane1.
setFont(new Font("宋体",
Font.
PLAIN,
12));
j1.add(textPane1);
jsroll3.setBounds(0, 220, 590, 80);
jsroll3.
setVerticalScrollBarPolicy(JScrollPane.
VERTICAL_SCROLLBAR_AS_NEEDED);
j1.add(jsroll3);
//
jb2.setBounds(470, 302, 100, 15);
jb2.
setFont(new Font("宋体",
Font.
PLAIN,
12));
j1.add(jb2);
@Override
{
try
{
jb2ActionPerfromed(e);
}
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
//
// 系统日志
j2.setLayout(null);
textPane2.setBounds(0, 0, 600, 300);
textPane2.setText("系统日志:\n");
textPane2.
setFont(new Font("宋体",
Font.
PLAIN,
12));
textPane2.setEditable(false);
j2.add(textPane2);
jsroll1.setBounds(0, 0, 590, 300);
jsroll1.
setVerticalScrollBarPolicy(JScrollPane.
VERTICAL_SCROLLBAR_AS_NEEDED);
j2.add(jsroll1);
jb3.setBounds(470, 302, 100, 15);
jb3.
setFont(new Font("宋体",
Font.
PLAIN,
12));
j2.add(jb3);
{
jb3ActionPerfromed(e);
}
});
//
j3.setLayout(null);
// 表格
myModel = new MyTableModel();
table.setEnabled(true);
table.setRowSelectionAllowed(true);// 设置可否被选择.默认为false
table.setShowHorizontalLines(true);
table.setShowVerticalLines(true);
table.
setGridColor(Color.
blue);
table.setBounds(0, 0, 600, 200);
jsroll2.setBounds(0, 0, 590, 300);
jsroll2.
setVerticalScrollBarPolicy(JScrollPane.
VERTICAL_SCROLLBAR_AS_NEEDED);
j3.add(jsroll2);
//
jb4.setBounds(470, 302, 100, 15);
jb4.
setFont(new Font("宋体",
Font.
PLAIN,
12));
j3.add(jb4);
@Override
{
jb4ActionPerfromed(e);
}
});
j4.setLayout(null);
jlable_setLimit
= new JLabel("同一个IP一天可申请的次数:");
jlable_setLimit.setBounds(10, 10, 200, 20);
textf_setLimit.setBounds(200, 10, 90, 20);
jb_setLimit.setBounds(300, 10, 60, 20);
jb_setLimit.
setFont(new Font("宋体",
Font.
PLAIN,
12));
j4.add(jlable_setLimit);
j4.add(jb_setLimit);
j4.add(textf_setLimit);
@Override
{
jb_setActionPerfromed(e);
}
});
jlable_setDatabase
= new JLabel("请选择连接数据库:");
jlable_setDatabase.setBounds(10, 40, 200, 20);
String item
[] = { "MySql",
"SQLServer" };
jcom_setDatabase.setBounds(200, 40, 90, 20);
jlable_warning
= new JLabel("(提示:请先停止服务器再更改此选项!)");
jlable_warning.setBounds(300, 40, 300, 20);
jlable_warning.
setFont(new Font("宋体",
Font.
PLAIN,
12));
j4.add(jlable_setDatabase);
j4.add(jcom_setDatabase);
j4.add(jlable_warning);
@Override
{
jcom_setDatabaseStateChanged(e);
}
});
//
tab.setBounds(0, 0, 600, 400);
tab.addTab("系统日志", j2);
tab.addTab("发送系统消息", j1);
tab.addTab("在线情况", j3);
tab.addTab("系统设置", j4);
tab.
setFont(new Font("宋体",
Font.
PLAIN,
12));
contentPane.add(tab);
m.
setFont(new Font("宋体",
Font.
PLAIN,
12));
this.setJMenuBar(m);
int x = (screensize.width - framesize.width) / 5;
int y = (screensize.height - framesize.height) / 5;
this.setLocation(x, y);
this.show();
setTitle("飞Q2012服务器");
// this.setIconImage(new ImageIcon("\\icon.jpg").getImage());
setResizable(false);
setSize(600, 400);
setVisible(true);
// ------------------------给textPane1添加键盘事件--------------------------------//
{
if (e.
isControlDown() && e.
getKeyCode() == KeyEvent.
VK_ENTER)
{
try
{
if (startFlag == 1)
{
sendSystemMessageThread sendSys = new sendSystemMessageThread(
textPane1.getText());
textPane0.setText(textPane0.getText()
+ (new Date()) + ":" + textPane1.
getText()
+ "\n");
textPane1.setText("");
}
else
{
"服务器已停止运行,请启动后再发系统消息!", "系统信息",
textPane1.setText("");
}
}
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
{
if (e.getKeyChar() >= '0' && e.getKeyChar() <= '9')
{}
}
{}
});
// ---------------------------------------------------------------------//
}
protected void jcom_setDatabaseStateChanged
(ItemEvent e
)
{
databaseFlag = jcom_setDatabase.getSelectedIndex();
}
{
String str1
= textf_setLimit.
getText();
if (str1.equals(""))
{
JOptionPane.
showMessageDialog(null,
"输入 不能为空!",
"输入错误",
return;
}
for (int i = 0; i < str1.length(); i++)
{
if (str1.charAt(i) < '0' || str1.charAt(i) > '9')
{
textf_setLimit.setText("");
JOptionPane.
showMessageDialog(null,
"输入的只能是数字!",
"输入错误",
return;
}
}
textf_setLimit.setText("");
}
{
myModel = new MyTableModel();
table.setModel(myModel);
table.repaint();
}
{
textPane2.setText("");
textPane2.setText("系统日志:\n");
}
{
if (startFlag == 1)
{
sendSystemMessageThread sendSys = new sendSystemMessageThread(
textPane1.getText());
textPane0.
setText(textPane0.
getText() + (new Date()) + ":"
+ textPane1.getText() + "\n");
textPane1.setText("");
}
else
{
JOptionPane.
showMessageDialog(null,
"服务器已停止运行,请启动后再发系统消息!",
"系统信息",
textPane1.setText("");
}
}
{
textPane0.setText("");
}
// 菜单
{
/**
* 菜单初始化操作
*/
{
fileMenu1.
setFont(new Font("宋体",
Font.
PLAIN,
12));
fileMenu2.
setFont(new Font("宋体",
Font.
PLAIN,
12));
fileMenu3.
setFont(new Font("宋体",
Font.
PLAIN,
12));
aboutMenuItem.
setFont(new Font("宋体",
Font.
PLAIN,
12));
exitMenuItem.
setFont(new Font("宋体",
Font.
PLAIN,
12));
startMenuItem.
setFont(new Font("宋体",
Font.
PLAIN,
12));
stopMenuItem.
setFont(new Font("宋体",
Font.
PLAIN,
12));
fileMenu1.add(exitMenuItem);
fileMenu2.add(startMenuItem);
fileMenu2.add(stopMenuItem);
fileMenu3.add(aboutMenuItem);
this.add(fileMenu1);
this.add(fileMenu2);
this.add(fileMenu3);
initAboutDialog();
// 菜单事件
{
String sql_update
= "update mainInfo set status = 0;";
dispose();
try
{
con1.createStatement().execute(sql_update);
}
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
{
aboutDialog.show();
}
});
@Override
{
try
{
stopServer();
startServer();
textPane2.
setText(textPane2.
getText() + (new Date())
+ ":" + "服务器重新启动成功!\n");
JOptionPane.
showMessageDialog(null,
"服务器重启成功!",
"系统信息",
}
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
@Override
{
try
{
stopServer();
}
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
setFont
(new Font("宋体",
Font.
PLAIN,
12));
}
/**
* 返回关于对话框
*/
{
return aboutDialog;
}
/**
* 设置"关于"对话框的外观及响应事件,操作和JFrame一样都是在内容 框架上进行的
*/
public void initAboutDialog()
{
aboutDialog.setTitle("关于QQserver");
Container con
= aboutDialog.
getContentPane();
// Swing 中使用html语句
"<html><b>"
+ "<center><br>QQserver</br><br>verson:1.0</br><br>Copyright © 2011 sdust,All rights reserved 版权所有 山东科技大学 王昌帅 司吉峰 王松松</br></html></b>",
aboutLabel.
setFont(new Font("宋体",
Font.
PLAIN,
15));
aboutDialog.setResizable(false);
aboutDialog.setSize(600, 200);
aboutDialog.setLocation(205, 300);
}
}
{
{
String sql_update
= "update mainInfo set status = 0;";
dispose();
try
{
con1.createStatement().execute(sql_update);
}
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
else
{
super.processWindowEvent(e);
}
}
// 启动服务器
public void startServer()
{
try
{
if (databaseFlag == 0)
{
System.
out.
println("链接mysql");
// 定义MySQL的数据库驱动程序
String DBDRIVER
= "com.mysql.jdbc.Driver";
// 定义MySQL数据库的连接地址
/*String DBURL1 = "jdbc:mysql://" + ip
+ ":3306/main?useUnicode=true&characterEncoding=utf8";
String DBURL2 = "jdbc:mysql://" + ip
+ ":3306/users?useUnicode=true&characterEncoding=utf8";*/
//jdbc\:mysql\://localhost\:3306/manchar2
String DBURL1
= "jdbc:mysql://localhost:3306/main?useUnicode=true&characterEncoding=utf8";
String DBURL2
= "jdbc:mysql://localhost:3306/users?useUnicode=true&characterEncoding=utf8";
// MySQL数据库的连接用户名
// MySQL数据库的连接密码
Class.forName(DBDRIVER); // 加载驱动程序
textPane2.
setText(textPane2.
getText() + (new Date()) + ":"
+ "已连接MySQL数据库\n");
}
else
{
// /////////////////////////////////////////////////////
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String url1
= "jdbc:sqlserver://" + ip
+ ":1433;DatabaseName=main;";
String url2
= "jdbc:sqlserver://" + ip
+ ":1433;DatabaseName=users;";
// ////////////////////////////////////////////////////////
textPane2.
setText(textPane2.
getText() + (new Date()) + ":"
+ "已连接SQLServer数据库\n");
}
}
{
JOptionPane.
showMessageDialog(null,
"连接数据库失败!",
"系统信息",
connectException = 1;
return;
}
try
//
{
String sql
= "select * from Password;";// 预读密码
while (res.next())
{
map_array_passwordMap.put(res.getString("qq"),
res.getString("password"));
}
String sql_sys
= "select * from systemMessage;";// 预读系统消息
ResultSet res_sys
= state.
executeQuery(sql_sys
);
while (res_sys.next())
{
if (res_sys.getString("warning") != null)
map_IsSysMessageExist.put(res_sys.getString("qq"), 1);
else
map_IsSysMessageExist.put(res_sys.getString("qq"), 0);
}
}
{
JOptionPane.
showMessageDialog(null,
"预读数据库信息失败!",
"系统信息",
connectException = 1;
return;
}
try
{
addCanUse = new addqqCanUseThread();
heartbeat = new heartbeatReceiver();
judgeAlive = new judgeAliveThread();
loginServer = new loginServerThread();
applicateServer = new applicateServerThread();
searchServer = new searchThread();
addServer = new addFriendsThread();
authenticationReceiveServer = new authenticationMessageReceiverThread();
agreeRefuseServer = new receiveAgreeRefuseThread();
deleteServer = new deleteFriendsThread();
getIpServer = new getAnotherQQIpThread();
getInfoServer = new getInfoThread();
getPasswordServer = new judgeWhetherQuestionExistThread();
receiverAnswerServer = new receiveSafeAnswerThread();
groupDealServer = new groupDealThread();
moveFriendServer = new moveFriendThread();
safeQuestionServer = new setSafeQuestionThread();
systemSettingServer = new systemSettingThread();
updatePasswordServer = new updatePasswordThread();
updatepersonalServer = new updatePersonalInfoThread();
updateRemarkServer = new updateRemarkThead();
}
{
JOptionPane.
showMessageDialog(null,
"启动服务器子程序异常,请重启!",
"系统信息",
connectException = 1;
return;
}
startFlag = 1;
jcom_setDatabase.setEnabled(false);
textPane2.
setText(textPane2.
getText() + (new Date()) + ":"
+ "服务器启动成功!\n");
}
@SuppressWarnings("deprecation")
{
if (connectException != 1)
{
addCanUse.stop();
heartbeat.stop();
judgeAlive.stop();
loginServer.stop();
applicateServer.stop();
searchServer.stop();
addServer.stop();
authenticationReceiveServer.stop();
agreeRefuseServer.stop();
deleteServer.stop();
getIpServer.stop();
getInfoServer.stop();
getPasswordServer.stop();
receiverAnswerServer.stop();
groupDealServer.stop();
moveFriendServer.stop();
safeQuestionServer.stop();
systemSettingServer.stop();
updatePasswordServer.stop();
updatepersonalServer.stop();
updateRemarkServer.stop();
heartbeat.server.close();
loginServer.server.close();
applicateServer.server.close();
searchServer.server.close();
addServer.server.close();
authenticationReceiveServer.server.close();
agreeRefuseServer.server.close();
deleteServer.server.close();
getIpServer.server.close();
getInfoServer.server.close();
getPasswordServer.server.close();
receiverAnswerServer.server.close();
groupDealServer.server.close();
moveFriendServer.server.close();
safeQuestionServer.server.close();
systemSettingServer.server.close();
updatePasswordServer.server.close();
updatepersonalServer.server.close();
updateRemarkServer.server.close();
map_date.clear();
map_IsSysMessageExist.clear();
map_onlineInfo.clear();
map_status.clear();
map_array_passwordMap.clear();
array_qqCanUse.clear();
String sql_update
= "update mainInfo set status = 0;";
con1.createStatement().execute(sql_update);
startFlag = 0;
jcom_setDatabase.setEnabled(true);
textPane2.
setText(textPane2.
getText() + (new Date()) + ":"
+ "服务器已停止!\n");
}
}
{
int count = map_onlineInfo.size();
private String[] columnNames
= { "QQ",
"ip",
"main_port",
"sys_port",
"heartbeat_port", "chat_port" };
public MyTableModel()
{
Map m
= serverMain.
map_onlineInfo;
for (int i = 0; ite.hasNext(); i++)
{
data[i][0] = key.toString();
data[i][1] = map_onlineInfo.get(key).ip;
data[i][2] = "" + map_onlineInfo.get(key).port_main;
data[i][3] = "" + map_onlineInfo.get(key).port_sys;
data[i][4] = "" + map_onlineInfo.get(key).port_alive;
data[i][5] = "" + map_onlineInfo.get(key).port_chat;
}
}
public int getColumnCount()
{
return columnNames.length;
}
public int getRowCount()
{
return data.length;
}
public String getColumnName
(int col
)
{
return columnNames[col];
}
public String getValueAt
(int row,
int col
)
{
return data[row][col];
}
public Class getColumnClass(int c)
{
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col)
{
return false;
}
}
{
serverMain server = new serverMain();
}
}