-
Notifications
You must be signed in to change notification settings - Fork 38
Expand file tree
/
Copy pathTcpClientWrapper.cs
More file actions
136 lines (121 loc) · 4.08 KB
/
TcpClientWrapper.cs
File metadata and controls
136 lines (121 loc) · 4.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace NetSdrClientApp.Networking
{
public class TcpClientWrapper : ITcpClient
{
private TcpClient? _tcpClient;
private NetworkStream? _stream;
private CancellationTokenSource _cts;
public bool Connected => _tcpClient != null && _tcpClient.Connected && _stream != null;
public event EventHandler<byte[]>? MessageReceived;
public TcpClientWrapper(string host, int port)
{
}
public void Connect()
{
if (Connected)
{
Console.WriteLine($"Already connected to {_host}:{_port}");
return;
}
_tcpClient = new TcpClient();
try
{
_cts = new CancellationTokenSource();
_tcpClient.Connect(_host, _port);
_stream = _tcpClient.GetStream();
Console.WriteLine($"Connected to {_host}:{_port}");
_ = StartListeningAsync();
}
catch (Exception ex)
{
Console.WriteLine($"Failed to connect: {ex.Message}");
}
}
public void Disconnect()
{
if (Connected)
{
_cts?.Cancel();
_stream?.Close();
_tcpClient?.Close();
_cts = null;
_tcpClient = null;
_stream = null;
Console.WriteLine("Disconnected.");
}
else
{
Console.WriteLine("No active connection to disconnect.");
}
}
public async Task SendMessageAsync(byte[] data)
{
if (Connected && _stream != null && _stream.CanWrite)
{
Console.WriteLine($"Message sent: " + data.Select(b => Convert.ToString(b, toBase: 16)).Aggregate((l, r) => $"{l} {r}"));
await _stream.WriteAsync(data, 0, data.Length);
}
else
{
throw new InvalidOperationException("Not connected to a server.");
}
}
public async Task SendMessageAsync(string str)
{
var data = Encoding.UTF8.GetBytes(str);
if (Connected && _stream != null && _stream.CanWrite)
{
Console.WriteLine($"Message sent: " + data.Select(b => Convert.ToString(b, toBase: 16)).Aggregate((l, r) => $"{l} {r}"));
await _stream.WriteAsync(data, 0, data.Length);
}
else
{
throw new InvalidOperationException("Not connected to a server.");
}
}
private async Task StartListeningAsync()
{
if (Connected && _stream != null && _stream.CanRead)
{
try
{
Console.WriteLine($"Starting listening for incomming messages.");
while (!_cts.Token.IsCancellationRequested)
{
byte[] buffer = new byte[8194];
int bytesRead = await _stream.ReadAsync(buffer, 0, buffer.Length, _cts.Token);
if (bytesRead > 0)
{
MessageReceived?.Invoke(this, buffer.AsSpan(0, bytesRead).ToArray());
}
}
}
catch (OperationCanceledException ex)
{
//empty
}
catch (Exception ex)
{
Console.WriteLine($"Error in listening loop: {ex.Message}");
}
finally
{
Console.WriteLine("Listener stopped.");
}
}
else
{
throw new InvalidOperationException("Not connected to a server.");
}
}
}
}