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 + -
显示快捷键?