?? chatservice.java
字號:
package com.easyjf.chat.business;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
public class ChatService implements Runnable {
private static final Map service=new HashMap();//會議室服務,系統中的當前會議室存放到該表集合中
private static final int maxServices=10;//可以同時開的最大會議室數
private static final SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
private final List msgs;//聊天信息Chat
private final List users;//在線用戶,ChatUser
private final List talkers;//排隊發言人數Talker
private final List manager;//會議室管理員
private Talker currentTalker;//當前發言人
private String cid;//會議室id
private String title;//會議室主題
private String intro;//會議室簡介
private String owner;//會議室創建人
private int maxUser;//最大在線人數
private int interval;//最大刷新時間間隔
private String vrtype;//訪問權限
private String vrvalue;//訪問值
private String announce;
private String password;//房間進入密碼
private int status;//會議室狀態
private String filePath;
//private Thread thread;
private boolean isStop=false;
public ChatService()
{
this.msgs=new ArrayList();
this.users=new ArrayList();
this.talkers=new ArrayList();
this.manager=new ArrayList();
this.maxUser=1000;//最大1000人同時
this.interval=1000*60*5;//5分鐘以前的信息
}
/**
* 停止所有會議室
*
*/
public static void clear()
{
if(!service.isEmpty())
{
Iterator it=service.values().iterator();
while(it.hasNext())
{
ChatService chat=(ChatService)it.next();
chat.stop();
}
}
service.clear();
}
/**
* 創建一個會議室
* @param name 會議室ID
* @return
*/
public static ChatService create(String name)
{
ChatService ret=null;
if(service.containsKey(name))
{
ChatService s=(ChatService)service.get(name);
s.stop();
service.remove(name);
}
if(service.size()<maxServices)
{
ret=new ChatService();
service.put(name,ret);
}
return ret;
}
/**
* 停止某個會議室
* @param name 會議室ID
* @return
*/
public static boolean close(String name)
{
ChatService chatRoom=ChatService.get(name);
if(chatRoom!=null)
{
chatRoom.stop();
service.remove(name);
}
return true;
}
/**
* 獲得一個會議室信息
* @param name 會議室ID
* @return
*/
public static ChatService get(String name)
{
if(service.containsKey(name))return (ChatService)service.get(name);
else return null;
}
public void run() {
// TODO Auto-generated method stub
//this.thread=Thread.currentThread();
while(!isStop)
{
//System.out.println("開始監控一個會議室!"+this.title);
this.flash();
try{
Thread.sleep(5000);
}
catch(Exception e)
{
e.printStackTrace();
}
}
//System.out.println("結束!");
}
public void stop()
{
this.flashAll();
isStop=true;
}
//會議室中有人發言
public boolean talk(Chat chat)
{
boolean ret=false;
if(canTalk(chat.getSender()))
{
this.msgs.add(chat);
ret=true;
}
return ret;
}
//新用戶加入會議室
public boolean join(ChatUser user)
{
boolean ret=false;
if(canJoin(user))
{
boolean isJoin=false;
for(int i=0;i<users.size();i++)
{
ChatUser u=(ChatUser)users.get(i);
if(u.getUserName().equals(user.getUserName()))
{
isJoin=true;
u.setLastAccessTime(new Date());
}
}
if(!isJoin)this.users.add(user);
talk(geneSystemMsg(user.getUserName()+"進入會議室!"));
ret=true;
}
return ret;
}
public boolean exit(ChatUser user)
{
talk(geneSystemMsg(user.getUserName()+"退出了會議室!"));
return this.users.remove(user);
}
public Chat geneSystemMsg(String info)
{
Chat msg=new Chat();
msg.setCid(geneId());
msg.setSender("系統");
msg.setContent(info);
msg.setVdate(new Date());
msg.setReciver("大家");
return msg;
}
//檢測用戶是否具有加入會議室的權限
public boolean canJoin(ChatUser user)
{
boolean ret=false;
String vrType=this.getVrtype();
if(vrType==null || (vrType.trim().equals("")))//所有人都能進入
{
ret=true;
}
else//判斷訪問權限
{
// 會員
if(vrType.equals("user"))
{
//ret=user!=null;
}
else if(vrType.equals("score"))//積分限制
{
//ret= user.getScore().intValue()>new Integer(this.getVrvalue()).intValue();
}
else if(vrType.equals("member"))
{
//ret=user.getTypes()!=null && (!user.getTypes().equals("")) && user.checkUserRole("member");
}
else if(vrType.equals("admin"))
{
//ret=user.getTypes()!=null && (!user.getTypes().equals("")) && user.checkUserRole("admin");
}
}
return ret;
}
//檢測用戶是否具有發言權限
public boolean canTalk(String userName)
{
if(this.getStatus()>0)
{
return (this.getCurrentTalker().getUserName().equals(userName));
}
else return true;
}
//讀取N條最新的發言信息
public List getNewestMsg(ChatUser user,String lastReadId)//根據上次讀出的Id號讀出聊天信息
{
List ret=new ArrayList();
user.setLastAccessTime(new Date());
long now=System.currentTimeMillis();
for(int i=msgs.size()-1;i>=0;i--)
{
Chat info=(Chat)msgs.get(i);
if((now-info.getVdate().getTime()>this.interval)||(info.getCid().equals(lastReadId)))break;
ret.add(0,info);
}
return ret;
}
public String geneId()
{
Random r = new Random(10);
String id = System.currentTimeMillis()+""+r.nextInt();
return id;
}
public String geneGuest()
{
int i=this.users.size()+1;
String userName="guest"+i;
if(this.users.contains(userName))userName="guest_"+i;
return userName;
}
//刷新信息,保存會議信息
public void flash()
{
flashChatMsg();
flashChatUser();
}
public void flashChatMsg()
{
long now=System.currentTimeMillis();
List delList=new ArrayList();
for(int i=0;i<msgs.size();i++)
{
Chat info=(Chat)msgs.get(i);
if((now-info.getVdate().getTime())>this.interval)delList.add(0,info);
}
StringBuffer s=new StringBuffer(1024);
for(int i=0;i<delList.size();i++)
{
Chat info=(Chat)msgs.get(i);
s.append("<font color=blue>"+info.getSender()+"</font>對<font color=blue>"+info.getReciver()+"</font>說:"+info.getContent()+"("+info.getVdate()+")\r\n");
}
if(s.length()>1) saveToFile(s.toString());
msgs.removeAll(delList);
}
public void flashChatUser()
{
long now=System.currentTimeMillis();
List delList=new ArrayList();
for(int i=0;i<users.size();i++)
{
ChatUser info=(ChatUser)users.get(i);
if((now-info.getLastAccessTime().getTime())>this.interval)delList.add(0,info);
}
for(int i=0;i<delList.size();i++)
{
ChatUser info=(ChatUser)delList.get(i);
this.talk(geneSystemMsg(info.getUserName()+"非正常退出會議!"));
}
users.removeAll(delList);
}
private void saveToFile(String s)
{
try{
File file=new File(filePath+"/"+this.title+"_"+df.format(new Date())+".txt");
if(!file.getParentFile().exists())file.getParentFile().mkdirs();
OutputStream o=new FileOutputStream(file,true);
OutputStreamWriter out=new OutputStreamWriter(o,"utf-8");
out.write(s);
out.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
//刷新信息,保存會議信息
public void flashAll()
{
StringBuffer s=new StringBuffer(1024);
for(int i=0;i<msgs.size();i++)
{
Chat info=(Chat)msgs.get(i);
s.append(info.getSender()+"對"+info.getReciver()+"說:"+info.getContent()+"("+info.getVdate()+")\r\n");
}
msgs.clear();
saveToFile(s.toString());
}
public int getInterval() {
return interval;
}
public void setInterval(int interval) {
this.interval = interval;
}
public int getMaxUser() {
return maxUser;
}
public void setMaxUser(int maxUser) {
this.maxUser = maxUser;
}
public String getVrtype() {
return vrtype;
}
public void setVrtype(String vrtype) {
this.vrtype = vrtype;
}
public String getVrvalue() {
return vrvalue;
}
public void setVrvalue(String vrvalue) {
this.vrvalue = vrvalue;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public List getTalkers() {
return talkers;
}
public List getUsers() {
return users;
}
public Talker getCurrentTalker() {
return currentTalker;
}
public void setCurrentTalker(Talker currentTalker) {
this.currentTalker = currentTalker;
}
public String getIntro() {
return intro;
}
public void setIntro(String intro) {
this.intro = intro;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public List getManager() {
return manager;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String getAnnounce() {
return announce;
}
public void setAnnounce(String announce) {
this.announce = announce;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -