最近我一直在玩 SignalR,发现它非常适合服务器/客户端通信。
然后我想到了一个与我目前正在从事的项目非常相关的场景。
基本思想是通过 ping 机器在网页上指示服务器当前是否在线。
该过程由第一个访问该页面的用户启动,并应在所有客户端断开连接时停止。
到目前为止,我的服务器代码是这样的:
public class PingHub : Hub
{
private static readonly ConcurrentDictionary<string, DateTime> _users = new ConcurrentDictionary<string, DateTime>();
private static bool _isPolling = false;
public override Task OnConnected()
{
_users.TryAdd(Context.ConnectionId, DateTime.Now);
return Clients.All.UserCountChanged(_users.Count);
}
public override Task OnReconnected()
{
_users.AddOrUpdate(Context.ConnectionId, DateTime.Now, (key, value) => value);
return Clients.All.UserCountChanged(_users.Count);
}
public override Task OnDisconnected()
{
DateTime value;
_users.TryRemove(Context.ConnectionId, out value);
return Clients.All.UserCountChanged(_users.Count);
}
public void GetStatus()
{
if (_isPolling)
return;
_isPolling = true;
var ping = new Ping();
do
{
var reply = ping.Send("X.X.X.X");
if (reply == null)
{
Clients.Caller.SetError(new { error = "No reply!" });
break;
}
Clients.All.SetStatus(new { Status = reply.Status.ToString(), Time = reply.RoundtripTime });
Thread.Sleep(500);
} while (_users.Count > 0);
_isPolling = false;
}
}
问题是启动进程的用户保持连接,即使浏览器已关闭(我通过记录每个 ping 请求对此进行了测试)。
那么任何人都可以帮助我按预期完成这项工作吗?