BadScript 2
Loading...
Searching...
No Matches
BadNetworkConsoleClient.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.Net.Sockets;
4using System.Threading;
5using System.Threading.Tasks;
6
9
11
16{
20 private readonly string m_Address;
21
25 private readonly TcpClient m_Client;
26
31
32
36 private readonly int m_Port;
37
41 private bool m_ExitRequested;
42
46 private Thread? m_ReadThread;
47
53 public BadNetworkConsoleClient(TcpClient client,
54 Func<BadNetworkConsoleClient, IBadNetworkConsoleClientCommandParser> parserFactory)
55 {
56 m_Client = client;
57 m_Address = "";
58 m_Port = -1;
59 m_Parser = parserFactory(this);
60 }
61
66 public BadNetworkConsoleClient(TcpClient client) : this(client, DefaultParserFactory) { }
67
73 public BadNetworkConsoleClient(string address, int port) : this(address, port, DefaultParserFactory) { }
74
81 public BadNetworkConsoleClient(string address,
82 int port,
83 Func<BadNetworkConsoleClient, IBadNetworkConsoleClientCommandParser> parserFactory)
84 {
85 m_Address = address;
86 m_Port = port;
87 m_Client = new TcpClient();
88 m_Parser = parserFactory(this);
89 }
90
94 public static int HeartBeatSendInterval { get; set; } = 3000;
95
99 public static int ConsoleReadInputSleep { get; set; } = 100;
100
104 public static int ConsoleWriteSleep { get; set; } = 100;
105
119
120
124 public void Start()
125 {
126 m_ExitRequested = false;
127 BadConsole.WriteLine($"[Console Client] Connecting to {m_Address}:{m_Port}");
128
129 if (!m_Client.Connected)
130 {
131 m_Client.Connect(m_Address, m_Port);
132 }
133
134 BadConsole.WriteLine("[Console Client] Connected");
135
136 m_ReadThread = new Thread(Write);
137 m_ReadThread.Start();
138 Read();
139 }
140
144 public void Stop()
145 {
146 m_ExitRequested = true;
147 }
148
154 private void ProcessPacket(BadConsolePacket packet)
155 {
156 switch (packet)
157 {
159 Console.Clear();
160
161 break;
163 m_ExitRequested = true;
164
165 break;
166 case BadConsoleHelloPacket hello:
168
169 break;
170 case BadConsoleWritePacket { IsWriteLine: true } wp:
171 Console.WriteLine(wp.Message);
172
173 break;
174 case BadConsoleWritePacket wp:
175 Console.Write(wp.Message);
176
177 break;
178 case BadConsoleColorChangePacket { IsBackground: true } cs:
179 Console.BackgroundColor = cs.Color;
180
181 break;
183 Console.ForegroundColor = cs.Color;
184
185 break;
186 default:
187 throw new BadNetworkConsoleException("Invalid Packet");
188 }
189 }
190
195 private void Read()
196 {
197 while (!m_ExitRequested)
198 {
199 if (!m_Client.Connected)
200 {
201 break;
202 }
203
204 if (m_Client.Available != 0)
205 {
206 byte[] len = new byte[sizeof(int)];
207 NetworkStream stream = m_Client.GetStream();
208 int read = stream.Read(len, 0, len.Length);
209
210 if (read != len.Length)
211 {
212 throw new BadNetworkConsoleException("Invalid Packet Size");
213 }
214
215 byte[] packet = new byte[BitConverter.ToInt32(len, 0)];
216 read = stream.Read(packet, 0, packet.Length);
217
218 if (read != packet.Length)
219 {
220 throw new BadNetworkConsoleException("Invalid Packet");
221 }
222
224 }
225 else
226 {
227 Thread.Sleep(ConsoleWriteSleep);
228 }
229 }
230
231 if (!m_Client.Connected)
232 {
233 return;
234 }
235
236 NetworkStream str = m_Client.GetStream();
237 List<byte> packetData = new List<byte>();
238 byte[] packetBytes = BadConsoleDisconnectPacket.Packet.Serialize();
239 packetData.AddRange(BitConverter.GetBytes(packetBytes.Length));
240 packetData.AddRange(packetBytes);
241 str.Write(packetData.ToArray(), 0, packetData.Count);
242 m_Client.Dispose();
243 }
244
248 private void SendHeartBeat()
249 {
250 byte[] packetData = BadConsoleHeartBeatPacket.Packet.Serialize();
251 List<byte> packet = new List<byte>();
252 packet.AddRange(BitConverter.GetBytes(packetData.Length));
253 packet.AddRange(packetData);
254
255 m_Client.GetStream()
256 .Write(packet.ToArray(), 0, packet.Count);
257 }
258
262 private void Write()
263 {
264 DateTime lastHeartBeat = DateTime.Now;
265
266 while (!m_ExitRequested)
267 {
268 Task<string> task = Task.Run(Console.ReadLine);
269
270 while (!m_ExitRequested && !task.IsCompleted)
271 {
272 if (lastHeartBeat + TimeSpan.FromMilliseconds(HeartBeatSendInterval) < DateTime.Now)
273 {
275 lastHeartBeat = DateTime.Now;
276 }
277
278 Thread.Sleep(ConsoleReadInputSleep);
279 }
280
281 if (m_ExitRequested)
282 {
283 break;
284 }
285
286 string message = task.Result ?? "client::disconnect";
287
288 if (message.StartsWith("client::"))
289 {
290 string cmd = message.Substring("client::".Length);
292
293 continue;
294 }
295
296 lastHeartBeat = DateTime.Now;
297 byte[] packetData = new BadConsoleReadPacket(message).Serialize();
298 List<byte> packet = new List<byte>();
299 packet.AddRange(BitConverter.GetBytes(packetData.Length));
300 packet.AddRange(packetData);
301
302 m_Client.GetStream()
303 .Write(packet.ToArray(), 0, packet.Count);
304 }
305
306 m_ReadThread = null;
307 }
308}
Wrapper class for the console abstraction.
Definition BadConsole.cs:12
static void WriteLine(string str)
Writes a string to the console and appends a newline.
Definition BadConsole.cs:78
Exception that is thrown when the remote console encounters an error.
void AddCommand(Func< BadNetworkConsoleClient, BadNetworkConsoleClientCommand > command)
Adds a Command to the Command List.
static int ConsoleReadInputSleep
The Interval in which packets are read from the server.
static IBadNetworkConsoleClientCommandParser DefaultParserFactory(BadNetworkConsoleClient client)
The Default Parser Factory.
static int ConsoleWriteSleep
The Interval in which packets are sent to the server.
BadNetworkConsoleClient(TcpClient client, Func< BadNetworkConsoleClient, IBadNetworkConsoleClientCommandParser > parserFactory)
Creates a new Client from the given TcpClient.
BadNetworkConsoleClient(string address, int port, Func< BadNetworkConsoleClient, IBadNetworkConsoleClientCommandParser > parserFactory)
Creates a new Client from the given Address and Port.
BadNetworkConsoleClient(string address, int port)
Creates a new Client from the given Address and Port.
BadNetworkConsoleClient(TcpClient client)
Creates a new Client from the given TcpClient.
static readonly BadConsoleDisconnectPacket Packet
Static Instance of this Packet.
static readonly BadConsoleHeartBeatPacket Packet
Static Instance of this Packet.
static BadConsolePacket Deserialize(byte[] data)
Deserializes a BadConsolePacket from the given data.
Contains the Console Client Implementation for the Remote Console Abstraction over TCP.
Contains the network packets for the remote console.