如何在服务器端捕获客户端的连接和断开连接?

时间:2011-09-25 03:15:49

标签: .net wcf wcf-client net.tcp

我使用WCF(net.tcp)编写了一个服务器/客户端。现在我想在服务器端捕获客户端的连接和断开连接。

1 个答案:

答案 0 :(得分:0)

如果您在WCF中内置了身份验证,只需稍加修改即可实现。

您在服务上创建了2个方法(Connect,Disconnect),其中Connect是客户端在启动(或登录)时调用的第一个方法,并断开最后一个方法客户端执行的操作。在服务器上,您将连接/断开连接记录到数据库或您选择的任何其他存储。

这很简单,可以满足您的需求。但是,如果客户端应用程序以意外异常结束或存在网络问题,您将不会知道它发生了。这就是我在服务器上添加另一个名为Refresh的方法的原因。这样做的方式 - 每次客户端调用connect时,都会在计时器上启动后台线程并每5分钟运行一次Refresh。这样,您的服务器端至少每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,则表示连接已丢失,用户需要重新连接(重新登录);

相关问题