⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chatservlet.java

📁 一个用java开发的自由聊天涂鸦室小程序,能给你一种不一样的感觉!
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -