1.解决上一次留下的问题:
log和reg的时候也有session,输出看一下这两个session是同一个不:
实测结果reg log accOnline中的session都是同一个对象,但是getAccid时候的session就是另一个了。
测试结果,说明在LogicHandler的process中就已经是不同的
public void process(Session session, SocketModel model)
{
try
{
switch (model.Type)
{
case 0:
Console.WriteLine("process-log:"+session.idTime);
LoginHandler.getInstance().process(session, model);
break;
case 1:
Console.WriteLine("process-map:"+session.idTime);
MapHandler.getInstance().process(session, model);
break;
case 2:
Console.WriteLine("process-user:"+session.idTime);
UserHandler.getInstance().process(session, model);
break;
}
}
catch (Exception ex)
{
//MyLog.form.textAdd(ex.Message);
Console.WriteLine(ex.Message);
}
}
再继续往上翻一层:
public static void readMessage(Session session, byte[] bytes)//读取数据包
{
try
{
ByteArray byteArray = new ByteArray(bytes);
int num1 = byteArray.ReadInt();
int num2 = byteArray.ReadInt();
int num3 = byteArray.ReadInt();
int length = byteArray.ReadInt();
string str = (string)null;
if (length > 0)
str = byteArray.ReadUTFBytes((uint)length);
LogicHandler.getInstance().process(session, new SocketModel()
{
Type = num1,
Area = num2,
Command = num3,
Message = str
});
Console.WriteLine("readMessage"+ num1+session.idTime+"!!!!!!!!!!!!!!!!!!!!!!!!!");
}
catch
{
}
}
结果很明显,在readMessage时就已经出现严重分化
再往上翻一层
private static void ReceiveCallBack(IAsyncResult ar)
{
Session asyncState = (Session)ar.AsyncState;
try
{
int count = asyncState.socket.EndReceive(ar);
if (count == 0)
{
//MyLog.form.textAdd("有客户端断开连接");
Console.WriteLine("有客户端断开连接");
LogicHandler.getInstance().sessionClose(asyncState);
return;
}
byte[] numArray = new byte[count];
Buffer.BlockCopy((Array)asyncState.message, 0, (Array)numArray, 0, count);
ServerStart.readMessage(asyncState, numArray);
}
catch (SocketException ex)
{
LogicHandler.getInstance().sessionClose(asyncState);
asyncState.socket.Close();
return;
}
asyncState.socket.BeginReceive(asyncState.message, 0, asyncState.message.Length, SocketFlags.None, new AsyncCallback(ServerStart.ReceiveCallBack), (object)asyncState);
}