📄 action.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 + -