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

📄 action.java

📁 功能全面的WEB聊天室原代码 非常经典 很有借鉴 07年毕业设计作品
💻 JAVA
字号:
package freech.action;

import java.io.IOException;
import java.io.PrintStream;

import java.net.Socket;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;

import freech.core.HttpDecoder;
import freech.core.TextChat;
import freech.layout.Template;
import freech.person.User;
import freech.person.UserManage;
import freech.room.Room;

public class Action {
	private PrintStream out=null;

	private Room room=null;

	private HttpDecoder request=null;
    
	public Action( PrintStream out,Room room, HttpDecoder request) {
		this.room = room;
		this.request = request;
		this.out = out;
		
	}

	public void list() {
		if(!watchDog("list")){
			return;
		}
		ArrayList users = room.getUsers();
		StringBuffer sb = new StringBuffer();
		sb.append("<html><head><title>用户列表</title></head><body>");
		sb.append("用户列表"+"<p>");
		for (int i=0;i<users.size() ;i++) {
			User u = (User) users.get( i);
			String username = u.getUserName();
			String html = "<br/><tr><td>" + username + "</td></tr>";
			
			sb.append(html);
		}
		sb.append("</body></html>");
		out.println(sb.toString() );
	}

	//把socket和用户绑定
	public void mainchat(Socket s) throws IOException {
		if(!watchDog("mainchat")){
			s.close();
			return;
		}
		Template tp = new Template();
	    tp.responseFile(out, "mainchat");
	    
		Hashtable t = UserManage.getInstance().getBinder1();
		String cookie = request.getCookie();
		User u = (User) t.get(cookie);
		UserManage.getInstance().bind2(u, s);
		u.setMainchat( room);
		System.out.println("mainchat  s="+s+"user="+u.getUserName() );
	}

	public void talk(){
		if(!watchDog("talk")){
			return;
		}
		Template t = new Template();
		t.responseFile( out,"talk");
	}
	
	public void dotalk() {
		if(!watchDog("dotalk")){
			return;
		}
		
		User u = null;
		Socket s = null;
		talk();
		
		if (((String)request.getParam().get("to_username")).equals("all")
				&& !(((String)request.getParam().get("message")).trim()).equals("")) {
			//遍历该房间用户链表
			System.out.println("users="+room.getUsers() .size() );
			for (int i =0;i<room.getUsers().size() ;i++) {
				u = (User) room.getUsers().get( i);
				s = (Socket) UserManage.getInstance().getBinder2().get(u);
				Hashtable t1 = UserManage.getInstance().getBinder1();
				String cookie = request.getCookie();
			    u = (User) t1.get(cookie);//自己
				System.out.println("dotalk  s="+s+"user="+u.getUserName() );
				new TextChat(s, request.getParam(),u);
				System.out.println("dotalk over1");
			}
		}else if(!((String)request.getParam().get("to_username")).equals("all")
				&& !(((String)request.getParam().get("message")).trim()).equals("")){
			String to_username = (String) request.getParam().get("to_username");
			u = UserManage.getInstance().getUserByname(room, to_username);
			s = (Socket) UserManage.getInstance().getBinder2().get(u);//获取该用户相应的socket
			Hashtable t1 = UserManage.getInstance().getBinder1();
			String cookie = request.getCookie();
		    u = (User) t1.get(cookie);//自己
		 
			System.out.println("s="+s+"user="+u.getUserName() );
			new TextChat(s, request.getParam(),u);//s为对方
			s = (Socket)UserManage.getInstance().getBinder2().get(u);//自己
			new TextChat(s, request.getParam(),u);//s为自己
			System.out.println("dotalk over2");
		} 
		
	}

	public void index(){
       Template t = new Template();
       t.responseFile(out, "index");//向浏览器发送主页面
	}

	public void login() {
		
		if(!watchDog("login")){
			return;
		}
		User u = new User();
		String username = "";
		String password = "";
		String cookie = "";
		
		 if (request.getParam().get("username").equals("")) {
			//系统生成一个随机用户名
			StringBuffer c = new StringBuffer();
			username="游客";
			c.append( username);
			while(c.length() <13){//8位数字
				char x = (char)Math.ceil( Math.random() *34);
				if (x < 10)x = (char)(x+48);
				else x = (char)(x+87);
				c.append( x);
			}
			username=c.toString() ;
			u.setUserName(username);
			u.setPassword(password);
			System.out.println("username="+username+"password="+password);
		 } else {   
			 //对于固定用户还有很多东西要处理,比如固定cookie等等,对后面的mainchat也有事情要做
			username = request.getParam().get("username").toString();
			u.setUserName(username);
			password = request.getParam().get("password").toString();
			u.setPassword(password);
			System.out.println("username="+username+"password="+password);
		 }
		
		room.addUser(u);
		//生成cookie
		cookie =createCookie(username,password);
		StringBuffer sb = appendCookie(cookie);
		out.println("HTTP/1.0 200 OK");
		out.println(sb.toString() ) ;
		UserManage.getInstance().bind1(u, cookie);
		Template t = new Template();
		t.responseFile(out,"frameset");//登录后,向浏览器发送框架文件
	}
	
	//向浏览器表明cookie
	private StringBuffer appendCookie(String cookie){
		StringBuffer sb = new StringBuffer();
		//sb.append( "\r\n");
		sb.append( "Set-Cookie: FreeChSession=");
		sb.append( cookie);
		sb.append( "; path=/;");
		return sb;
	}
	
	private String createCookie(String username,String password){
		String cookie ="";
		boolean ok =false;
		while(!ok){
			StringBuffer c = new StringBuffer();
			c.append( username);
			c.append( password);
			while(c.length() <32){//32为cookie的长度
				char x = (char)Math.ceil( Math.random() *34);
				if (x < 10)x = (char)(x+48);
				else x = (char)(x+87);
				c.append( x);
			}
			cookie = c.toString() ;
			User u = UserManage.getInstance() .getUserByCookie( cookie);
			if(u!=null)continue;
			ok = true;
		}
		return cookie;
	}
	
	//检查非法连接,例如:不通过login,直接连接
	private boolean watchDog(String flag){
		boolean ok=false,inthisroom=false;
		User u=null;
		
		Hashtable t1 = UserManage.getInstance().getBinder1();
		String cookie = request.getCookie();
		
		if(cookie!=null){
	      u = (User) t1.get(cookie);
	     }else{
	    	
	    }
	    //是否登录了这个房间
	    for(int i=0;i<room.getUsers().size() ;i++){
	    	if(u!=null && u.equals( (User)room.getUsers() .get( i))){
	    		inthisroom =true;
	    	}
	    }
	    if(flag.equals( "login")){
	    	if(request.getParam().get("username")==null ||
					request.getParam().get("password")==null){
				//不允许直接发起login连接,必须经过index
				System.out.println("username=null,so go to index");
				index();
	    	}else if(u!=null && inthisroom){//避免从同一个房间重复登录
					System.out.println("从同一台机子重复登录");
					
	    	}else{
	    		ok =true;
	    	}
	    }else if(flag.equals( "list")||flag.equals( "talk")){
	      if(u!=null && inthisroom){
	    	  ok =true;
	      }else{
			   System.out.println("list或talk非法连接");
		   }
	    }else if(flag.equals( "mainchat")){
	    	//!u.isMainchat( room).equals("yes")
	    	//合法用户登录后,已经通过mainchat绑定了,就不能再绑定了
	    	
	    	if(u!=null && inthisroom ){
	    		if(!u.isMainchat( room).equals("yes") && u.isMainchat( room).equals("no")){
		    	       ok =true;
		    	}else{
					   System.out.println("mainchat非法连接1");
				   }
	    	}else{
			   System.out.println("mainchat非法连接2");
		   }
	    	
	    }else if(flag.equals( "dotalk")){
	    	Enumeration e =request.getParam().keys() ;
	    	//e.hasMoreElements(),登录后参数不能为null
	    	if(u!=null && e.hasMoreElements() && inthisroom){
	    		//to_username是房间里的用户名
    		  for(int i=0;i<room.getUsers().size();i++){
    			String to_username = (String)request.getParam() .get( "to_username");
    			String name=((User)room.getUsers() .get( i)).getUserName();
    			if(name.equals( to_username) ){
    			    ok =true;
    			    break;
    			}else if(to_username.equals( "all")){
    				ok =true;
        			break;
    			}
    		 }
		   }else{
			   System.out.println("dotalk非法连接");
		   }
	    	
    	}
		return ok;
	   
	}
	
	public HttpDecoder getParam() {
		return request;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -