2013年3月17日

SuperSocket的研究(9)—— 向客户主动端推送数据

使用Session对象向客户端发送数据

我们已经提到过,AppSession表示一个逻辑socket连接,基于连接的各种操作应该被定义在这个类中。AppSession也封装了一些发送数据的方法。你可以是使用AppSession的Send(...)方法来向客户端发送数据。
session.Send(data, 0, data.Length);
//或者
session.Send("Welcome to use SuperSocket!");

按SessionID获取Session

正如在前一部分提到的,如果你已经得到了连接的Session实例,你就可以使用Send(...)方法来向客户端发送数据。但在一些情况下,你无法直接取到你所需要的那个Session实例。SuperSocket提供一个API允许你从AppServer的Session容器中按Session ID获取一个Session。
var session = appServer.GetSessionByID(sessionID);

if(session != null)
    session.Send(data, 0, data.Length);
什么是SessionID?
SessionID是AppSession类中用来识别Session的一个属性。在SupserSocket TCP服务器里,SessionID是在Session一经创建就立即分配的一个GUID字符串。如果你在SuperSocket UDP服务器中没有使用UdpRequestInfo,那么SessionID将由远程断电的IP和端口组成;如果在SuperSocket UDP服务器中使用了UdpRequestInfo,SessionID的值将从客户端传回来。

获取所有已连接的Session

你也可以从AppServer实例中获取所有已连接的Session,然后向所有客户端推送数据:
foreach(var session in appServer.GetAllSessions())
{
    session.Send(data, 0, data.Length);
} 
如果你启用了Session快照,通过AppServer.GetAllSessions()方法获取到的Session并不是实时更新的,而是上一次快照生成时AppServer中的所有已连接的Session。

按条件获取Session

如果在你的AppSession中有一个自定义的“CompanyId”属性,你希望获取所有已连接Session中CompanyId等于某一确定值的所有Session,那么AppServer的GetSession(...)方法会十分有用:
var sessions = appServer.GetSessions(s => s.CompanyId == companyId);
foreach(var s in sessions)
{
    s.Send(data, 0, data.Length);
}
与GetAllSessions(...)方法一样,如果启用了Session快照,该方法获取到的Session也来自于快照。

没有评论:

发表评论