192 lines
5.2 KiB
C#
192 lines
5.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Linq;
|
|
using System.IO;
|
|
|
|
//StormClient对数据的处理相关内容
|
|
|
|
namespace Interact
|
|
{
|
|
public partial class StormClient
|
|
{
|
|
//处理连接中断异常。
|
|
private static void HandleConnectionBroken(Exception ex)
|
|
{
|
|
lock (statusLocker)
|
|
{
|
|
if (Status != ClientStatus.Running)
|
|
return;
|
|
statusLocker = ClientStatus.Stopped;
|
|
tcpClient.Close();
|
|
OnDisconnect?.Invoke(ex);
|
|
}
|
|
}
|
|
|
|
#region 处理服务器数据
|
|
//根据包头信息处理数据
|
|
private static void HandleAll(byte[] head, byte[] data)
|
|
{
|
|
string headStr = Encoding.UTF8.GetString(head);
|
|
JObject jsonObj = (JObject)JsonConvert.DeserializeObject(headStr);
|
|
switch (jsonObj[AttrNames.Operation].ToString())
|
|
{
|
|
case Operations.Panic:
|
|
HandlePanic(GetResultHead(jsonObj));
|
|
break;
|
|
case Operations.Login:
|
|
HandleLoginResult(jsonObj, data);
|
|
break;
|
|
case Operations.TransMessage:
|
|
HandleMessage(jsonObj, data);
|
|
break;
|
|
case Operations.SendMessage:
|
|
HandleSendMessageResult(GetResultHead(jsonObj));
|
|
break;
|
|
case Operations.Offline:
|
|
HandlePanic(GetResultHead(jsonObj));
|
|
break;
|
|
case Operations.UpdateUserInfo:
|
|
HandleUpdateUserInfoDone(GetResultHead(jsonObj));
|
|
break;
|
|
case Operations.GetUsers:
|
|
HandleGetUsersPack(jsonObj, data);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
//提取基本结果包头结构
|
|
private static ResultHead GetResultHead(JObject head)
|
|
{
|
|
ResultHead resultHead = new ResultHead
|
|
{
|
|
Token = head[AttrNames.Token].ToString(),
|
|
Operation = head[AttrNames.Operation].ToString(),
|
|
};
|
|
if (head[AttrNames.Error] != null)
|
|
resultHead.Error = head[AttrNames.Error].ToString();
|
|
return resultHead;
|
|
}
|
|
|
|
//处理服务器异常断开连接消息
|
|
private static void HandlePanic(ResultHead head)
|
|
{
|
|
SetStatus(ClientStatus.Stopped);
|
|
OnPanic?.Invoke(head);
|
|
}
|
|
|
|
//处理登录反馈消息
|
|
private static void HandleLoginResult(JObject head, byte[] data)
|
|
{
|
|
//提取结果包头
|
|
ResultHead resultHead = GetResultHead(head);
|
|
//发起登录完成事件
|
|
if (head[AttrNames.Error].ToString() != "")
|
|
{
|
|
OnLoginDone?.Invoke(resultHead, null);
|
|
return;
|
|
}
|
|
User user = new User
|
|
{
|
|
Name = head[AttrNames.User].ToString(),
|
|
NickName = head[AttrNames.NickName].ToString(),
|
|
Motto = head[AttrNames.Motto].ToString(),
|
|
Group = (UserGroup)Enum.Parse(typeof(UserGroup), head[AttrNames.UGroup].ToString()),
|
|
Photo = User.DefaultPhoto
|
|
};
|
|
if (int.Parse(head[AttrNames.Photo].ToString()) > 0)
|
|
{
|
|
user.Photo = new MemoryStream(data);
|
|
} //用户头像数据
|
|
OnLoginDone?.Invoke(resultHead, user);
|
|
}
|
|
|
|
//收到消息
|
|
private static void HandleMessage(JObject head, byte[] data)
|
|
{
|
|
//提取结果包头
|
|
ResultHead resultHead = GetResultHead(head);
|
|
Message message = new Message()
|
|
{
|
|
When = DateTime.Parse(head[AttrNames.When].ToString()),
|
|
From = User.FromUserName(head[AttrNames.From].ToString()),
|
|
To = User.Me,
|
|
Text = Encoding.UTF8.GetString(data)
|
|
};
|
|
OnMessage?.Invoke(message);
|
|
}
|
|
|
|
//发送消息执行结果
|
|
private static void HandleSendMessageResult(ResultHead head)
|
|
{
|
|
OnSendMessageDone?.Invoke(head);
|
|
}
|
|
|
|
//处理掉线、强制登出
|
|
private static void HandleOffiline(ResultHead head)
|
|
{
|
|
SetStatus(ClientStatus.Stopped);
|
|
OnOffline?.Invoke(head);
|
|
}
|
|
|
|
//处理更改信息结果
|
|
private static void HandleUpdateUserInfoDone(ResultHead head)
|
|
{
|
|
OnUpdateUserInfoDone?.Invoke(head);
|
|
}
|
|
|
|
//处理获取用户列表的不连续返回包。当所有包接收完毕后返回给客户
|
|
private static void HandleGetUsersPack(JObject head, byte[] data)
|
|
{
|
|
ResultHead result = GetResultHead(head);
|
|
if (head[AttrNames.Error].ToString() != string.Empty)
|
|
{
|
|
OnGetUserListDone?.Invoke(result, new User[0]);
|
|
return;
|
|
} //获取失败
|
|
else if (int.Parse(head[AttrNames.Count].ToString()) <= 0)
|
|
{
|
|
User[] us;
|
|
if (workingDictionary.ContainsKey(result.Token))
|
|
us = workingDictionary[result.Token] as User[];
|
|
else
|
|
us = new User[0];
|
|
User.Users = us;
|
|
OnGetUserListDone?.Invoke(result, us);
|
|
return;
|
|
} //获取完成
|
|
//获取用户数据
|
|
User user = new User
|
|
{
|
|
Name = head[AttrNames.User].ToString(),
|
|
NickName = head[AttrNames.NickName].ToString(),
|
|
Motto = head[AttrNames.Motto].ToString(),
|
|
Group = (UserGroup)Enum.Parse(typeof(UserGroup), head[AttrNames.UGroup].ToString()),
|
|
Photo = User.DefaultPhoto
|
|
}; //基础数据
|
|
if (int.Parse(head[AttrNames.Photo].ToString()) > 0)
|
|
{
|
|
user.Photo = new MemoryStream(data);
|
|
} //头像数据
|
|
//加入临时用户列表缓存
|
|
User[] users;
|
|
int total = int.Parse(head[AttrNames.Total].ToString()); //总用户数
|
|
int count = int.Parse(head[AttrNames.Count].ToString()); //已接收用户数
|
|
if (count > total)
|
|
return;
|
|
if (workingDictionary.ContainsKey(head[AttrNames.Token].ToString()))
|
|
users = workingDictionary[result.Token] as User[];
|
|
else
|
|
users = new User[total];
|
|
users[count - 1] = user;
|
|
workingDictionary[result.Token] = users;
|
|
}
|
|
#endregion
|
|
|
|
}
|
|
|
|
}
|