servicepane.java
来自「一个简单的程序稳操胜券用拖把有稳操胜券」· Java 代码 · 共 967 行 · 第 1/3 页
JAVA
967 行
/**
* @(#)server.frm.panes.ServicePane.java 2008-8-28
* Copy Right Information : Tarena
* Project : JavaQQ
* JDK version used : jdk1.6.4
* Comments : 系统服务面板类。
* Version : 1.0
* Sr Date Modified By Why & What is modified
* 1. 2008-8-28 小猪 新建
**/
package server.frm.panes;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.io.Serializable;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import dao.LogDAOByFile;
import dao.RecordDAOByFile;
import dao.UserDAOByFile;
import data.FriendUser;
import data.JQMessage;
import data.Log;
import data.LoginUser;
import data.Record;
import data.RegUser;
import data.User;
import data.UserState;
import server.JQServer;
import server.frm.Server;
import tools.DateDeal;
import tools.GetParameter;
import tools.JQCreater;
/**
* 系统服务面板类。<br>
* 完成功能:系统的启动与停止<br>
* 用户的连接日志显示。
* 2008-8-28
* @author 达内科技[Tarena Training Group]
* @version 1.0
* @since JDK1.6(建议)
*/
public class ServicePane extends JPanel implements ActionListener,Runnable{
/** 启动JQ服务按钮 */
private JButton btnStart = new JButton("启动Java QQ服务");
/** 停止JQ服务按钮 */
private JButton btnStop = new JButton("停止Java QQ服务");
/** */
private ServecieProcessBar bar = new ServecieProcessBar(300,30);
/** 显示连接日志 */
private JTextArea areaLog = new JTextArea();
private ServerSocket server = null;
public static Hashtable<Integer,ClientLink> table = null;
private Thread thread;
private static boolean isServiceRun = false;
private String path = "log.txt";
private PrintWriter raf = null;
public ServicePane() {
try {
raf = new PrintWriter(new BufferedOutputStream(new FileOutputStream(new File(path),true)));
} catch (FileNotFoundException e) {
areaLog.append("发生异常错误,请确保"+path+"文件可写!原因如下:"+e.getMessage());
btnStart.setEnabled(false);
}
thread = new Thread(this);
setLayout(new FlowLayout(FlowLayout.CENTER));
areaLog.setEditable(false);
areaLog.setLineWrap(true);
bar.setPreferredSize(new Dimension(580,27));
btnStart.addActionListener(this);
btnStop.addActionListener(this);
btnStop.setEnabled(false);
JPanel pane = new JPanel();
pane.setPreferredSize(new Dimension(600,70));
pane.setLayout(new FlowLayout(FlowLayout.CENTER));
pane.add(btnStart);
pane.add(btnStop);
pane.add(bar);
setLayout(new BorderLayout());
add(pane,BorderLayout.NORTH);
add(new JScrollPane(areaLog),BorderLayout.CENTER);
add(new FillWidth(4,4),BorderLayout.WEST);
add(new FillWidth(4,4),BorderLayout.EAST);
}
/**
* 初始化配置文件。
*/
public void initProp(){
try {
Server.prop = GetParameter.getProp();
} catch (Exception e) {
writeSysLog(DateDeal.getCurrentTime()+",加载配置文件时发生错误!原因如下:"+e.getMessage());
}
int dataWay = Integer.parseInt(Server.prop.getProperty(GetParameter.keys[6]));
if(dataWay==0)
Server.isFileWay = true;
else{
Server.isFileWay = false;
writeSysLog("注意:系统暂不支持数据库方式!请使用文件方式保存数据!");
}
int saveLog = Integer.parseInt(Server.prop.getProperty(GetParameter.keys[4]));
if(saveLog==1)
Server.isSaveLog = true;
else
Server.isSaveLog = false;
}
/**
* 启动按钮、停止按钮的事件。
*/
public void actionPerformed(ActionEvent e) {
if(e.getSource()==btnStart){
initProp();
if(!Server.isFileWay){
JOptionPane.showMessageDialog(null, "暂不支持数据库存储方式!请选择文件方式!");
return;
}
try {
btnStart.setEnabled(false);
btnStop.setEnabled(true);
bar.startRoll();
startServer();
} catch (IOException e1) {
writeSysLog(DateDeal.getCurrentTime()+",JQ服务器启动服务时发生错误,原因如下:"+e1.getMessage());
}
}
if(e.getSource()==btnStop){
btnStart.setEnabled(true);
btnStop.setEnabled(false);
bar.stopRoll();
try {
stopServer();
} catch (IOException e1) {
writeSysLog(DateDeal.getCurrentTime()+",JQ服务器停止服务时发生错误,原因如下:"+e1.getMessage());
}
}
}
/**
* 书写系统日志。
* @param log 日志。
*/
public void writeSysLog(String log){
areaLog.append(log+"\n");
//滚动条自动下滚
areaLog.setCaretPosition(areaLog.getDocument().getLength());
raf.write(log+"\n");
raf.flush();
}
/**
* 书写日志。
* @param log 日志。
*/
private void writeLog(Log log){
try {
LogDAOByFile LogDAO = new LogDAOByFile();
LogDAO.add(log);
Server.logPane.getAreaLog().append(log.toString()+"");
Server.logPane.getAreaLog().setCaretPosition(Server.logPane.getAreaLog().getDocument().getLength());
} catch (IOException e) {
writeSysLog(DateDeal.getCurrentTime()+",写入操作日志["+log.toString()+"]时发生错误:"+e.getMessage());
}
}
/**
* 启动服务器。
* @throws IOException IO异常。
*/
public void startServer() throws IOException{
isServiceRun = true;
int port = Integer.parseInt(Server.prop.getProperty(GetParameter.keys[0]));
table = new Hashtable<Integer,ClientLink>();
server = new ServerSocket(port);
new Thread(this).start();
writeSysLog(DateDeal.getCurrentTime()+",JQ服务器服务启动成功!等待JQ用户上线...");
}
/**
* 停止服务器。
* @throws IOException IO异常。
*/
public void stopServer() throws IOException{
isServiceRun = false;
Enumeration<ClientLink> en = table.elements();
while(en.hasMoreElements()){
ClientLink client = en.nextElement();
client.updateUserState(client.jqnum, UserState.OFFLIENSTATE.getState());
client.letClientQuit();
}
table.clear();table=null;
if(server!=null)
server.close();
server = null;
writeSysLog(DateDeal.getCurrentTime()+",JQ服务器服务停止成功!");
}
@Override
public void run() {
while(isServiceRun){
try {
Socket client = server.accept();
//System.out.println("come accept");
new Thread(new ClientLink(client)).start();
} catch (IOException e) {
writeSysLog(DateDeal.getCurrentTime()+",JQ服务器接受客户端时发生异常:"+e.getMessage());
}
}
}
/**
* 客户端连接类。处理和客户端的各种消息。
* 2008-9-27
* @author 达内科技[Tarena Training Group]
* @version 1.0
* @since JDK1.6(建议)
*/
private class ClientLink implements Runnable,Serializable{
public Socket client = null;
public ObjectInputStream ois = null;
public ObjectOutputStream oos = null;
public int jqnum = -1;
public ClientLink(Socket client) {
this.client = client;
writeSysLog(DateDeal.getCurrentTime()+",客户端"+getClientIP()+"]连接到服务端");
try {
ois = new ObjectInputStream(new BufferedInputStream(client.getInputStream()));
oos = new ObjectOutputStream(new BufferedOutputStream(client.getOutputStream()));
//ois = new ObjectInputStream(client.getInputStream());
//oos = new ObjectOutputStream(client.getOutputStream());
//System.out.println("come client");
} catch (IOException e) {
writeSysLog(DateDeal.getCurrentTime()+",获取到客户端"+getClientIP()+"的连接发生错误:"+e.getMessage());
}
}
/*以1开头的:注册相关消息
10:客户端发送注册信息到服务端
11:服务端回复注册成功到客户端
12:服务端回复注册失败到客户端
以2开头的:登陆相关消息
20:客户端发送登陆信息到服务端(判断此用户是否已登录)
21:登陆成功服务端发送好友信息到客户端
22:登录失败服务端发送错误信息到客户端
23:服务端发送账号在别处登陆
24:客户端发送退出到服务端
25:服务端发送好友上线功能
以3开头的:发送记录相关消息
30:客户端发送消息到服务端
31:服务端根据消息发送到客户端
以4开头的:搜索在线用户加好友相关消息
40:客户端发送获取在线用户数
41:服务端发送在线用户数
42:客户端发送获取当前在线用户
43:服务端发送在线列表用户
44:客户端发送添加好友的qq号
45:服务端发送添加好友成功
46:服务端发送添加好友失败
以9开头的:系统相关消息
90:服务端发送下线功能到客户端
91:服务端发送广播消息到客户端
*/
@Override
public void run() {
if(Server.isFileWay){
try {
while(isServiceRun && ois!=null && oos!=null){
Object obj = ois.readObject();
//System.out.println("come");
if(obj instanceof JQMessage){
JQMessage message = (JQMessage)obj;
int type = message.getType();
//System.out.println(type);
if(type==10){
dealRegiter(message);
break;
}else{
switch(type){
case 20:
DealLogin(message);
break;
case 24:
dealQuit(message);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?