diff --git a/HeartbeatSender.cs b/HeartbeatSender.cs new file mode 100644 index 0000000..4f138af --- /dev/null +++ b/HeartbeatSender.cs @@ -0,0 +1,39 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Timers; +namespace HeartbeatSender{ + public class heartbeatSender + { + private readonly UdpClient udpClient; + private readonly IPEndPoint remoteEndPoint; + private readonly System.Timers.Timer heartbeatTimer; + public IPEndPoint RemoteEndPoint => remoteEndPoint; + public heartbeatSender(string targetIp, int targetPort, int intervalMilliseconds = 3000) + { + udpClient = new UdpClient(); + // 設置 IP 和 PORT + remoteEndPoint = new IPEndPoint(IPAddress.Parse(targetIp), targetPort); + heartbeatTimer = new System.Timers.Timer(intervalMilliseconds); + heartbeatTimer.Elapsed += SendHeartbeat; + heartbeatTimer.AutoReset = true; + } + private void SendHeartbeat(object sender, ElapsedEventArgs e) + { + try + { + string heartbeatMessage = "HEARTBEAT"; + byte[] data = Encoding.UTF8.GetBytes(heartbeatMessage); + udpClient.Send(data, data.Length, remoteEndPoint); + Console.WriteLine($"Heartbeat sent to {remoteEndPoint.Address}:{remoteEndPoint.Port}"); + } + catch (Exception ex) + { + Console.WriteLine($"Error sending heartbeat: {ex.Message}"); + } + } + public void Start() => heartbeatTimer.Start(); + public void Stop() => heartbeatTimer.Stop(); + } +} \ No newline at end of file diff --git a/PrimaryFormParts/PrimaryForm.MultiPagePanel.cs b/PrimaryFormParts/PrimaryForm.MultiPagePanel.cs index c20854a..86a08bb 100644 --- a/PrimaryFormParts/PrimaryForm.MultiPagePanel.cs +++ b/PrimaryFormParts/PrimaryForm.MultiPagePanel.cs @@ -385,13 +385,13 @@ namespace DualScreenDemo // 若播放公播歌單,代表已點歌曲皆已播放完畢 hasBeenPlayed = true; songLabel.ForeColor = Color.Gray; - statusText = IsSimplified ? "(播毕)" : "(播畢播畢)"; + statusText = IsSimplified ? "(播毕)" : "(播畢)"; } else { // 計算已完成播放的歌曲數量 int completedCount = currentSongIndexInHistory; - Console.WriteLine("currentSongIndexInHistory:" + currentSongIndexInHistory); + //Console.WriteLine("currentSongIndexInHistory:" + currentSongIndexInHistory); // 遍歷已點歌曲歷史 /*for (int i = 0; i <= currentSongIndexInHistory && i < playedSongsHistory.Count; i++) { if (i == currentSongIndexInHistory) { @@ -414,14 +414,14 @@ namespace DualScreenDemo // 已播放完成 hasBeenPlayed = true; songLabel.ForeColor = Color.Gray; - statusText = IsSimplified ? "(播毕)" : "(播畢播畢)"; + statusText = IsSimplified ? "(播毕)" : "(播畢)"; } else if (songPosition == completedCount) { // 正在播放 isCurrentlyPlaying = true; songLabel.ForeColor = Color.LimeGreen; - statusText = IsSimplified ? "(播放中)" : "(播放中播放中)"; + statusText = IsSimplified ? "(播放中)" : "(播放中)"; } else { diff --git a/TCPServer.cs b/TCPServer.cs index 7d2e00d..641b5be 100644 --- a/TCPServer.cs +++ b/TCPServer.cs @@ -4,8 +4,8 @@ using System.Text; using System.Text.RegularExpressions; using System.IO; // 為 Path 和 File 提供支持 using DBObj; -using System.Diagnostics; using OverlayFormObj; +using HeartbeatSender; namespace DualScreenDemo { public class TCPServer @@ -82,6 +82,10 @@ namespace DualScreenDemo { listener.Start(); Console.WriteLine("Server started on port " + Port + "."); + // 心跳封包 + //heartbeatSender sender = new heartbeatSender("127.0.0.1", 8888); + //sender.Start(); + // Console.WriteLine($"heart beat for server{sender.RemoteEndPoint.Address}:{sender.RemoteEndPoint.Port}"); try { string stateFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"txt","states.txt"); string initialState = ReadStateFile(stateFilePath);