This repository has been archived on 2025-06-24. You can view files and clone it, but cannot push or open issues or pull requests.
KTVApp/TcpServer.cs

113 lines
3.5 KiB
C#
Raw Normal View History

2025-03-18 11:16:57 +08:00
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace KTVApp
{
public class TcpServer
{
private TcpListener _listener;
private bool _isRunning;
// 添加事件来通知接收到的消息
// 保留原有的消息事件
public event Action<string> MessageReceived;
// 添加新的命令事件
public event Action<string, string> CommandReceived;
public TcpServer(int port)
{
_listener = new TcpListener(IPAddress.Any, port);
}
public void Start()
{
_isRunning = true;
_listener.Start();
ListenForClients();
}
public void Stop()
{
_isRunning = false;
_listener.Stop();
}
private async void ListenForClients()
{
while (_isRunning)
{
try
{
var client = await _listener.AcceptTcpClientAsync();
HandleClient(client);
}
catch (Exception ex)
{
Console.WriteLine($"Error accepting client: {ex.Message}");
}
}
}
private async Task HandleClient(TcpClient client)
{
Console.WriteLine("客戶端已連接");
using NetworkStream stream = client.GetStream();
try
{
byte[] buffer = new byte[1024];
while (true)
{
Array.Clear(buffer, 0, buffer.Length);
int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
if (bytesRead == 0) break;
string message = Encoding.UTF8.GetString(buffer, 0, bytesRead).Trim();
Console.WriteLine($"收到訊息: {message}");
// 解析消息
ParseAndExecuteCommand(message);
// 回傳確認訊息
byte[] responseBuffer = Encoding.UTF8.GetBytes("OK");
await stream.WriteAsync(responseBuffer, 0, responseBuffer.Length);
}
}
catch (Exception ex)
{
Console.WriteLine($"發生錯誤: {ex.Message}");
}
finally
{
Console.WriteLine("連接完成");
}
}
private void ParseAndExecuteCommand(string message)
{
try
{
string[] parts = message.Split(',');
if (parts.Length >= 2)
{
string roomNumber = parts[0];
string command = parts[1];
// 觸發兩個事件
MessageReceived?.Invoke(message); // 原有的事件
CommandReceived?.Invoke(roomNumber, command); // 新的命令事件
}
}
catch (Exception ex)
{
Console.WriteLine($"解析命令時發生錯誤: {ex.Message}");
}
}
}
}