1.首先保证服务器接受到的信息正确,在服务器的LogicHandler.cs中做第一次分拣:
public void process(Session session, SocketModel model)
{try{switch (model.Type){case 0:LoginHandler.getInstance().process(session, model);break;case 1:MapHandler.getInstance().process(session, model);break;case 2:UserHandler.getInstance().process(session, model);break;}}catch (Exception ex){//MyLog.form.textAdd(ex.Message);Console.WriteLine(ex.Message);}
}
2.当前客户端发出的command=2(UserProtocol.CREATE_CREQ)
NetWorkScript.getInstance().sendMessage(Protocol.USER,0,UserProtocol.CREATE_CREQ,message);
3.然后去全局static类,UserHandler中对应的处理单元:
public void process(Session session, SocketModel model)
{switch (model.Command){case 0:this.list(session);break;case 2:this.create(session, model);break;case 4:this.select(session, model);break;case 6:this.remove(session, model);break;}
}
private void create(Session session, SocketModel model)
{Console.WriteLine("UserHandler.create");string accId = OnLineUtil.getAccId(session);Console.WriteLine(accId);CreateDTO createDto = Coding<CreateDTO>.decode(model.Message);Console.WriteLine(model.Message);session.write(2, 0, 3, (object) BizUtil.user.create(accId, createDto.name, createDto.job));
}
逆向出来的服务器,在这个单元是存在问题的
4.本意是给对应键的部分增加2个值,而现在却查不到键。
public static string getAccId(Session session){string accId = "";bool r=OnLineUtil.sessionToAcc.TryGetValue(session, out accId);Console.WriteLine(r);return accId;}
排查问题出在getAccId函数内,这个函数在之前的注册登录时没有用过,整个项目的4次调用全在UserHandler中。
TryGetValue是根据key返回相应的数据到value,这个方法的返回是bool值,如果dictionary里有存在相应的key为true,没有存在,则为false。c#自带的应该是不会出问题的。所以推断问题出在OnLineUtil.sessionToAcc,估计这个字典大概率是空的。唯一增加OnLineUtil.sessionToAcc字典的函数只有accOnLine,的调用也只有唯一一处:
调试发现accOnLine可以成功通过TryAdd来增加字典!
问题就应该是两次的session不一样!这里的session应该是一个对象的地址!想办法输出来看看。
使用public DateTime idTime = DateTime.Now;,在不同的session对象创建时通过记录时间来做区别。得到结论,两处的session是不同的,所以根本不可能TryAdd后得到true。