113 lines
3.5 KiB
C#
113 lines
3.5 KiB
C#
|
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}");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|