📄 chatservlet.java
字号:
package freechat;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.util.Hashtable;
import java.util.Enumeration;
import java.util.Vector;
import java.util.ResourceBundle;
import java.util.PropertyResourceBundle;
public class ChatServlet extends HttpServlet implements Runnable{
private RoomList rooms = new RoomList();
private UserList users = new UserList();
private Message message;
private final static String defaultStartpage = "/freechat/room.htm";
private Thread reaper;
protected static final int TIMEOUT = 5*60*1000;
static final String CONFIG_BUNDLE_NAME = "freechat";
private String startPage="/freechat/room.htm";
public void init(ServletConfig config) throws ServletException{
super.init(config);
int currPriority = Thread.currentThread().getPriority();
int newPriority = currPriority == Thread.MIN_PRIORITY?Thread.MIN_PRIORITY:currPriority-1;
Room room=new Room("main","SYSOP");
reaper = new Thread(this,"ChatReaper");
reaper.setDaemon(true);
reaper.setPriority(newPriority);
reaper.start();
rooms.add(room);
try{
PropertyResourceBundle configBundle =(PropertyResourceBundle)PropertyResourceBundle.getBundle(CONFIG_BUNDLE_NAME);
startPage=configBundle.getString("startpage").trim();
}catch(Exception e){
startPage = defaultStartpage;
}
return;
}
public void destroy(){
super.destroy();
if(reaper!=null&&reaper.isAlive()) reaper.stop();
return;
}
public void service(HttpServletRequest req, HttpServletResponse res) throws IOException,ServletException{
String user,mode,usermsg;
String room;
Room roomObject;
javax.servlet.http.HttpSession session = req.getSession(true);
/*if(req.getQueryString()==null){
if(getInitParameter("startpage")==null) res.sendRedirect(defaultStartpage);
else res.sendRedirect(getInitParameter("startpage"));
return;
}*/
mode = req.getParameter("mode");
//user = req.getParameter("user");
user = (String)session.getValue("user");
room = (String)session.getValue("room");
if(mode==null){
sendError(res,"Mode not set");
return;
}
if(user==null&&!mode.equals("list")&&!mode.equals("login")){
sendError(res,"User not set");
return;
}
if(mode.equals("login")){
System.out.println("begin login");
user = req.getParameter("user");
room = "main";
System.out.println("begin detect");
if(users.exists(user)){
sendError(res,"User exists");
return;
}
System.out.println("detect ok");
if(!users.add(user)){
sendError(res,"Problem adding user");
return;
}
System.out.println("add ok");
rooms.addUser("main",user);
System.out.println("room add ok");
session.putValue("user",user);
session.putValue("room","main");
//users.addMessage(new Message("Chat",user+"has joined the chat."));
Enumeration roommates=rooms.getRoomUsers("main");
while(roommates.hasMoreElements()){
users.addUserMessage((String)roommates.nextElement(),new Message("Chat",user+"has joined the chat."));
}
log("The user"+ user + " logged in.");
res.sendRedirect(startPage);
//sendResp(res,"User logged in.");
return;
}
else if(mode.equals("logout")){
if(!users.exists(user)){
sendError(res,"User does not exist.");
return;
}
if(!users.drop(user)){
sendError(res,"Problem deleting user");
return;
}
if(!rooms.dropRoomUser(room,user)){
sendError(res,"Problem deleting user");
return;
}
rooms.touch(room);
users.addMessage(new Message("Chat",user+" has left the chat."));
log("The user "+user+ " logged out.");
sendResp(res,"User logged out.");
return;
}
else if(mode.equals("poll")){
if(!users.exists(user)){
sendError(res,"User does not exist.");
return;
}
returnMessages(res,users.getMessages(user));
rooms.touch(room);
users.truncUserMsgs(user);
return;
}
else if(mode.equals("send")){
StringBuffer str1=new StringBuffer(50),str2=new StringBuffer(200);
usermsg = req.getParameter("message");
if(usermsg==null){
sendError(res,"Message not set for send");
return;
}
switch(CommandParser.parse(usermsg,str1,str2)){
case -1:
addRoomMessage(room,new Message(user,usermsg));
break;
case 0: // open room
System.out.println("str1:"+str1);
System.out.println("str2:"+str2);
if(rooms.exists(str1.toString())) break;
rooms.dropRoomUser(room,user);
rooms.add(new Room(str1.toString(),user));
rooms.addUser(str1.toString(),user);
//session.putValue("room",usermsg.substring(2));
users.addMessage(new Message("系统",user+"开房间"+str1.toString()));
session.removeValue("room");
session.putValue("room",str1.toString());
room = str1.toString();
break;
case 1: // enter room
System.out.println("str1:"+str1.toString());
System.out.println("str2:"+str2.toString());
if(!rooms.exists(str1.toString())) break;
roomObject = (Room)rooms.get(str1.toString());
if(!roomObject.isDoorOpen()&&!roomObject.getOwner().equals(user)){
addRoomMessage(room,new Message("系统",user+"想进入房间"+str1.toString()+",但门关了!"));
break;
}
rooms.dropRoomUser(room,user);
rooms.addUser(str1.toString(),user);
//session.putValue("room",usermsg.substring(3));
users.addMessage(new Message("Chat",user+"进入房间"+str1.toString()));
session.removeValue("room");
session.putValue("room",str1.toString());
room = str1.toString();
break;
case 2: // open room door
if(!rooms.exists(str1.toString())) break;
roomObject = (Room)rooms.get(str1.toString());
if(!roomObject.getOwner().equals(user)) break;
roomObject.openDoor();
addRoomMessage(room,new Message("系统",user+"打开房间"+str1.toString()+"!"));
break;
case 3: // close room door
if(!rooms.exists(str1.toString())) break;
roomObject = (Room)rooms.get(str1.toString());
if(!roomObject.getOwner().equals(user)) break;
roomObject.closeDoor();
addRoomMessage(room,new Message("系统",user+"关闭房间"+str1.toString()+"!"));
break;
case 4: // person talk
if(!users.exists(str1.toString())) break;
users.addUserMessage(str1.toString(),new Message(user,str2.toString()));
users.addUserMessage(user,new Message(user,str2.toString()));
break;
case 5: // clean screen
users.resetUser(user);
System.out.println("reset");
System.out.println(user+" Messages:"+users.getMessages(user));
break;
}
/*if((usermsg.trim()).length()>=4){
if(usermsg.substring(0,3).equals("/r ")){
rooms.dropRoomUser(room,user);
rooms.add(new Room(usermsg.substring(3),user));
rooms.addUser(usermsg.substring(3),user);
//session.putValue("room",usermsg.substring(2));
users.addMessage(new Message("Chat",user+"开房间"+usermsg.substring(3)));
session.removeValue("room");
session.putValue("room",usermsg.substring(3));
room = usermsg.substring(3);
}
}
if((usermsg.trim()).length()>=4){
System.out.println("usermsg:"+usermsg.substring(0,3));
if(usermsg.substring(0,3).equals("/i ")){
System.out.print("room:"+room);
System.out.print(usermsg.substring(3));
rooms.dropRoomUser(room,user);
rooms.addUser(usermsg.substring(3),user);
//session.putValue("room",usermsg.substring(3));
users.addMessage(new Message("Chat",user+"进入房间"+usermsg.substring(3)));
session.removeValue("room");
session.putValue("room",usermsg.substring(3));
room = usermsg.substring(3);
}
}*/
//users.addMessage(new Message(user,usermsg));
rooms.touch(room);
//addRoomMessage(room,new Message(user,usermsg));
returnMessages(res,users.getMessages(user));
//users.resetUser(user);
users.truncUserMsgs(user);
//sendResp(res,"Message Added.");
return;
}
else if(mode.equals("list")){
returnUserList(res);
return;
}
else{
sendError(res,"Invalid Mode.");
return;
}
}
public void run(){
while(!Thread.interrupted()){
Enumeration inactive = users.inactive(TIMEOUT);
while(inactive.hasMoreElements()){
String user = (String)inactive.nextElement();
users.drop(user);
users.addMessage(new Message("Chat",user + " has timed out."));
users.addMessage(new Message("Chat","Dropping " +user+" from the chat."));
log("User "+user+" timed out. Dropped from chat.");
}
inactive = rooms.inactive(TIMEOUT);
while(inactive.hasMoreElements()){
String room = (String)inactive.nextElement();
if(!room.equals("main")) rooms.drop(room);
else{
users.addMessage(new Message("Chat",room + " has timed out."));
users.addMessage(new Message("Chat","Dropping " +room+" from the chat."));
log("Room "+room+" timed out. Dropped from chat.");
}
}
try{
Thread.sleep(TIMEOUT);
}catch(InterruptedException e){
}
}
}
protected void sendError(HttpServletResponse res,String error){
try{
//PrintStream pout = new PrintStream(res.getOutputStream());
PrintWriter pout = res.getWriter();
pout.print("-ERR "+error+"\r\n");
pout.flush();
pout.close();
}catch(IOException e){
}
}
protected void sendResp(HttpServletResponse res,String resp){
try{
res.setDateHeader("Expires ",System.currentTimeMillis());
//PrintStream pout = new PrintStream(res.getOutputStream());
PrintWriter pout = res.getWriter();
pout.print(" + OK "+resp+"\r\n");
pout.flush();
pout.close();
}catch(IOException e){
}
}
protected void returnMessages(HttpServletResponse res,Enumeration messagelist){
try{
//res.setDateHeader("Expires ",System.currentTimeMillis());
//PrintStream pout = new PrintStream(res.getOutputStream());
PrintWriter pout = res.getWriter();
pout.println("<HTML><HEAD><TITLE></TITLE>");
pout.println("<META content=\"text/html; charset=gb2312\" http-equiv=Content-Type>");
pout.println("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"7;URL=http:/servlet/freechat.ChatServlet?mode=poll\">");
pout.println("<META content=\"MSHTML 5.00.2014.210\" name=GENERATOR></HEAD>");
pout.println("<BODY bgColor=#ffffff style=\"FONT-FAMILY: 宋体; FONT-SIZE: 12pt\" topMargin=0>");
while(messagelist.hasMoreElements()){
Message message=(Message)messagelist.nextElement();
pout.print("[<FONT color=olive><B>"+message.getUser()+"</FONT></B>]");
pout.println("<FONT color=#90a53e>"+message.getMessage()+"</FONT><BR>");
System.out.println(message.getUser()+":"+message.getMessage());
}
pout.println("</BODY></HTML>");
pout.flush();
pout.close();
}catch(IOException e){
}
}
protected void returnUserList(HttpServletResponse res){
try{
//res.setDateHeader("Expires ",System.currentTimeMillis());
//PrintStream pout = new PrintStream(res.getOutputStream());
PrintWriter pout = res.getWriter();
Enumeration userlist = users.list();
Enumeration roomlist = rooms.list();
Enumeration roommates;
Room room;
int i=0;
pout.print("<HTML><HEAD><TITLE>用户列表</TITLE>");
pout.println("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"61;URL=http:/servlet/freechat.ChatServlet?mode=list\">");
pout.println("<META content=\"text/html; charset=gb_2312-80\" http-equiv=Content-Type>");
pout.println("<META content=\"MSHTML 5.00.2014.210\" name=GENERATOR>");
pout.println("<STYLE type=text/css>A:link {");
pout.println("COLOR: #cccccc; FONT-SIZE: 9pt; LINE-HEIGHT: 150%; TEXT-DECORATION: none}");
pout.println("A:visited {");
pout.println("COLOR: #cccccc; FONT-SIZE: 9pt; TEXT-DECORATION: none}");
pout.println("A:hover {COLOR: #ffffff; TEXT-DECORATION: none}");
pout.println("A:active {COLOR: #cccccc; FONT-SIZE: 9pt; TEXT-DECORATION: none}");
pout.println("TD {COLOR: #000000; FONT-SIZE: 9pt}");
pout.println("</STYLE>");
pout.println("</HEAD>");
pout.println("<BODY bgColor=#ccccff leftMargin=2 topMargin=8>");
pout.println("<TABLE border=0 cellPadding=0 cellSpacing=0 width=\"20%\">");
pout.println("<TBODY>");
pout.println("<TR>");
pout.println("<TD width=\"100%\">");
pout.println("<FORM action=/servlet/freechat.ChatServlet method=post>");
pout.println("<INPUT TYPE=hidden name=mode value=list>");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -