using system; using system.data; using system.data.sqlclient; using system.collections ; using system.threading ; using system.web; using system.diagnostics;
namespace sohoproject { //定义了一个结构 public struct user { public string name; public datetime lasttime; public datetime curtime; public string sessionid; public string ip; public string iswhere; }
public class onlineuser { private static datatable _alluser;
//只读属性 public datatable alluser{ get{return _alluser;} }
public onlineuser() { if(_alluser==null) { //define user list // declare variables for datacolumn and datarow objects. _alluser = new datatable("onlineuser");
datacolumn mydatacolumn;
// create new datacolumn, set datatype, columnname and add to datatable. mydatacolumn = new datacolumn(); mydatacolumn.datatype = system.type.gettype("system.string"); mydatacolumn.columnname = "name"; mydatacolumn.autoincrement = false; mydatacolumn.caption = "name"; mydatacolumn.readonly = false; mydatacolumn.unique = false; _alluser.columns.add(mydatacolumn);
//功能说明:将当前用户加入在线列表 //如果该用户的数据当前仍然在在线列表中,则暂时先不让该用户登陆,提示用户存在 public bool addusertoonline(user user) { #if debug (new sohoproject.sohodebug()).writetodoc("开始进入<将当前用户加入在线列表>...."); (new sohoproject.sohodebug()).writetodoc("/r/n"); #endif
//开始搜索是否已经存在该用户,如果存在则是改变数据,否则添加新的用户 string strexpr; strexpr = "sessionid='" + user.sessionid + "'"; datarow[] curuser; // use the select method to find all rows matching the filter. #if debug (new sohoproject.sohodebug()).writetodoc("搜索字符串:" + strexpr); (new sohoproject.sohodebug()).writetodoc("/r/n"); #endif
curuser = _alluser.select(strexpr);
#if debug (new sohoproject.sohodebug()).writetodoc(strexpr); (new sohoproject.sohodebug()).writetodoc(curuser.length.tostring()); #endif
if (curuser.length >0 ) { for(int i = 0; i < curuser.length; i ++) { curuser[i]["curtime"]=datetime.now; curuser[i]["iswhere"]=user.iswhere; } } else { //直接加入新的数据 datarow myrow; try { myrow = _alluser.newrow(); // then add the new row to the collection. myrow["name"] = user.name; myrow["ip"] = user.ip; myrow["iswhere"] = user.iswhere; myrow["lasttime"] = user.lasttime; myrow["curtime"] = datetime.now; myrow["sessionid"] = user.sessionid; _alluser.rows.add(myrow); } catch(exception e) { throw(new exception(e + "--------------------" + e.tostring())) ; } } _alluser.acceptchanges(); return true; }
//功能说明:判断某用户是否在线,本部分暂时不用 //返回值:true代表在线,false不在 public boolean isuseronline(string name) { //需要先判断用户是否已经在用户列表中了 //开始搜索是否已经存在该用户,如果存在则是改变数据,否则添加新的用户 string strexpr; strexpr = "name ='" + name + "'"; datarow[] curuser; // use the select method to find all rows matching the filter. curuser = _alluser.select(strexpr);
//onlineuser alluser= new onlineuser(); addusertoonline(newuser); } return(false); } }
/* 下面开始建立守护线程类: (注:此处,开始写的时候本来想做成单件模式的,不过由于以前没有做过这个东西,所以反而发生 了很多问题,最后决定放弃而使用现有的格式) */ public class checkonline { const int delay_times = 10000 ; //定义执行的时间间隔为5秒 const int delay_seconds=60; //将用户掉线时间设置为30秒