BBS水木清华站∶精华区
发信人: loveangel (琴儿), 信区: Java
标 题: 程序2:chatservlet.java
发信站: BBS 水木清华站 (Sun Aug 13 20:25:32 2000)
import java.io.PrintStream;
import java.io.OutputStream;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Enumeration;
import java.util.Vector;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
/**
* Insert the type's description here.
* Creation date: (00-8-3 16:00:40)
* @author: Administrator
*/
class chatservlet extends HttpServlet implements Runnable
{
private UserList users=new UserList();
private Message message;
private final static String defaultStartpage="/gochat.html";
private Thread reaper;
protected static final int TIMEOUT=5*60*1000;
/**
* chatservlet constructor comment.
*/
public chatservlet() {
super();
}
public void destroy()
{
super.destroy();
if(reaper!=null&&reaper.isAlive())
{
reaper.stop();
}
return;
}
/**
* Insert the method's description here.
* Creation date: (00-8-3 16:01:37)
*/
public void init(ServletConfig config) throws ServletException
{
super.init(config);
int currPriority=Thread.currentThread().getPriority();
int newPriority=currPriority==Thread.MIN_PRIORITY?Thread.MIN_PRIORITY:currP
riority-1;
reaper=new Thread(this,"ChatReaper");
reaper.setDaemon(true);
reaper.setPriority(newPriority);
reaper.start();
return;
}
protected void returnMessages(HttpServletResponse res,Enumeration messageli
st)
{
try
{
res.setDateHeader("Expires",System.currentTimeMillis());
PrintStream pout=new PrintStream(res.getOutputStream());
pout.print("+OK\r\n");
while(messagelist.hasMoreElements())
{
Message message=(Message)messagelist.nextElement();
pout.print(message+"\r\n");
}
pout.print(".\r\n");
pout.flush();
pout.close();
}
catch(IOException e)
{
}
}
protected void returnUserList(HttpServletResponse res)
{
try
{
res.setDateHeader("Expires",System.currentTimeMillis());
PrintStream pout=new PrintStream(res.getOutputStream());
pout.print("+OK\r\n");
Enumeration userlist=users.list();
while(userlist.hasMoreElements())
{
pout.print((String)userlist.nextElement());
pout.print("\r\n");
}
pout.print(".\r\n");
pout.flush();
}
catch(IOException e)
{
}
}
/**
* run method comment.
*/
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("Caht","Dropping"+user+"frome the chat."));
log("User"+user+"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());
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());
pout.print("+OK"+resp+"\r\n");
pout.flush();
pout.close();
}
catch(IOException e)
{
}
}
public void service(HttpServletRequest req,HttpServletResponse res)
throws IOException,ServletException
{
String user,mode,usermsg;
if(req.getQueryString()==null)
{
if(getInitParameter("startpage")==null)
res.sendRedirect(defaultStartpage);
res.sendRedirect(getInitParameter("startpage"));
return;
}
mode=req.getParameter("mode");
user=req.getParameter("user");
if(mode==null)
{
sendError(res,"Mode not set");
return;
}
if(user==null&&!mode.equals("list"))
{
sendError(res,"User not set");
return;
}
if(mode.equals("login"))
{
if(users.exists(user))
{
sendError(res,"User exists");
return;
}
if(!users.add(user))
{
sendError(res,"Problem adding user");
return;
}
users.addMessage(new Message("Chat",user+"has joined the chat."));
log("The user"+user+"logged in.");
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;
}
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,"Invalid user");
return;
}
returnMessages(res,users.getMessages(user));
users.resetUser(user);
return;
}
else if(mode.equals("send"))
{
usermsg=req.getParameter("message");
if(usermsg==null)
{
sendError(res,"Message not set for send");
return;
}
users.addMessage(new Message(user,usermsg));
sendResp(res,"Message Added.");
return;
}
else if(mode.equals("list"))
{
returnUserList(res);
return;
}
else
{
sendError(res,"Invalid Mode.");
return;
}
}
}
--
※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.120.5.34]
BBS水木清华站∶精华区