我已经使用 WCF (net.tcp) 编写了一个服务器/客户端。现在我想在服务器端捕获客户端的连接和断开连接。
问问题
158 次
1 回答
0
如果您在 WCF 中构建了身份验证并稍作修改,则可以实现此目的。
您在服务上创建了 2 个方法(Connect、Disconnect),其中 Connect 是客户端在启动(或登录)时调用的第一件事,而 Disconnect 是客户端执行的最后一个方法。在服务器上,您将连接/断开记录到数据库或您选择的任何其他存储。
这很简单,可以满足您的需求。但是,如果客户端应用程序以意外异常结束或存在网络问题,您将不会知道它发生了。这就是为什么我要在服务器上添加另一种称为 Refresh 的方法的原因。这将工作的方式 - 每次客户端调用连接时,您都会在计时器上启动一个后台线程并每 5 分钟运行一次刷新。这样,您的服务器端至少每 5 分钟记录一次客户端的活动。此外,我会每 10 分钟在服务器上创建一个在计时器上运行的 Windows 服务,如果有任何未刷新的连接,它会创建一个强制断开连接。
这就是服务器上高级代码的工作方式:
[DataContract]
public class Session
{
public string UserName { get; set; }
public byte[] passwordHash { get; set; }
public Guid sessionGuid { get; set; }
}
public bool Connect(Session sessionObject)
{
if (GetOpenSession(sessionObject.sessionGuid) == null)
{
if (CreateNewSession(sessionObject)) return true; else return false;
}
else
{
CloseSession(GetOpenSession(sessionObject.sessionGuid));
if (CreateNewSession(sessionObject)) return true; else return false;
}
}
public void Disconnect(Guid sessionGuid)
{
if (GetOpenSession(sessionGuid) != null)
{
CloseSession(GetOpenSession(sessionGuid));
}
}
public bool Refresh(Guid sessionGuid)
{
if (GetOpenSession(sessionGuid) != null)
{
UpdateSession(sessionGuid);
return true;
}
else
{
return false;
}
}
在客户端,如果 Connect 或 Refresh 返回 false,则表示连接已丢失,用户需要重新连接(重新登录);
于 2011-09-25T09:04:16.260 回答