基本的にハートビートであるクラスを作成しました。クライアントは x 秒ごとにサーバーにメッセージを送信します。
恥知らずに盗まれた コードを送る
private void SendUdpPacket() {
byte[] data = new byte[1024];
Socket udpClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
data = Encoding.ASCII.GetBytes("lubdub");
udpClientSocket.SendTo(data, 0, data.Length, SocketFlags.None, ipep);
}
恥知らずに盗まれたコードを受け取る
void ReceiveData(IAsyncResult iar) {
byte[] buffer = new byte[1024];
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint tempRemoteEP = (EndPoint)sender;
Socket remote = (Socket)iar.AsyncState;
int recv = remote.EndReceiveFrom(iar, ref tempRemoteEP);
string stringData = Encoding.ASCII.GetString(buffer, 0, recv);
Console.WriteLine(stringData);
lastUpdate = DateTime.Now.ToUniversalTime();
if (!this.IsDisposed) {
udpServerSocket.BeginReceiveFrom(buffer, 0, 1024, SocketFlags.None, ref ep, new AsyncCallback(ReceiveData), udpServerSocket);
}
これは、内部タイマーによって監視されます
private void clTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
try {
SendUdpPacket();
connected = true;
} catch {
connected = false;
}
}
private void srTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
// Calculate the Timespan since the Last Update from the Client.
timeSinceLastHeartbeat = DateTime.Now.ToUniversalTime() - lastUpdate;
if (timeSinceLastHeartbeat > TimeSpan.FromMilliseconds(Timer.Interval))
connected = false;
else
connected = true;
}
メッセージが成功した場合、ソケットが接続されます。これは public ブール値で示されますconnected
したがって、私のアプリケーションでは、次のようにタイマーを実行します。
private void ServerCheck() {
if (heartin.connected) {
GKstat = true;
GKStatus.Text = "GateKeeper Status: Connected";
} else {
GKstat = false;
GKStatus.Text = "GateKeeper Status: Disconnected";
}
}
ただし、クライアントまたはサーバーのタイマーが接続されているかどうかを常に確認する必要があるため、これは理想的ではありませんHeart
。
これを一連のイベントに変換することが有益かどうか疑問に思っていましたOnConnectionLost
.OnConnected
私はいろいろなページを見回して読んでいましたが、それらは私をさらに混乱させるだけでした.
これは私がこれまでに持っているものです
public delegate void OnConnectionLost(Heart sender, EventArgs e);
public delegate void OnConnected(object sender, EventArgs e);
public event OnConnectionLost ConnectionLost;
私の質問は、これは有益でしょうか?もしそうなら、接続状態が変化したときにのみ発生するような方法でイベントを作成するにはどうすればよいですか?