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, Func<BadNetworkConsoleClient, IBadNetworkConsoleClientCommandParser> parserFactory)
54 {
55 m_Client = client;
56 m_Address = "";
57 m_Port = -1;
58 m_Parser = parserFactory(this);
59 }
60
65 public BadNetworkConsoleClient(TcpClient client) : this(client, DefaultParserFactory) { }
66
72 public BadNetworkConsoleClient(string address, int port) : this(address, port, DefaultParserFactory) { }
73
80 public BadNetworkConsoleClient(string address, int port, Func<BadNetworkConsoleClient, IBadNetworkConsoleClientCommandParser> parserFactory)
81 {
82 m_Address = address;
83 m_Port = port;
84 m_Client = new TcpClient();
85 m_Parser = parserFactory(this);
86 }
87
91 public static int HeartBeatSendInterval { get; set; } = 3000;
92
96 public static int ConsoleReadInputSleep { get; set; } = 100;
97
101 public static int ConsoleWriteSleep { get; set; } = 100;
102
116
117
121 public void Start()
122 {
123 m_ExitRequested = false;
124 BadConsole.WriteLine($"[Console Client] Connecting to {m_Address}:{m_Port}");
125
126 if (!m_Client.Connected)
127 {
128 m_Client.Connect(m_Address, m_Port);
129 }
130
131 BadConsole.WriteLine("[Console Client] Connected");
132
133
134 m_ReadThread = new Thread(Write);
135 m_ReadThread.Start();
136 Read();
137 }
138
142 public void Stop()
143 {
144 m_ExitRequested = true;
145 }
146
152 private void ProcessPacket(BadConsolePacket packet)
153 {
154 switch (packet)
155 {
157 Console.Clear();
158
159 break;
161 m_ExitRequested = true;
162
163 break;
164 case BadConsoleHelloPacket hello:
166
167 break;
168 case BadConsoleWritePacket { IsWriteLine: true } wp:
169 Console.WriteLine(wp.Message);
170
171 break;
172 case BadConsoleWritePacket wp:
173 Console.Write(wp.Message);
174
175 break;
176 case BadConsoleColorChangePacket { IsBackground: true } cs:
177 Console.BackgroundColor = cs.Color;
178
179 break;
181 Console.ForegroundColor = cs.Color;
182
183 break;
184 default:
185 throw new BadNetworkConsoleException("Invalid Packet");
186 }
187 }
188
193 private void Read()
194 {
195 while (!m_ExitRequested)
196 {
197 if (!m_Client.Connected)
198 {
199 break;
200 }
201
202 if (m_Client.Available != 0)
203 {
204 byte[] len = new byte[sizeof(int)];
205 NetworkStream stream = m_Client.GetStream();
206 int read = stream.Read(len, 0, len.Length);
207
208 if (read != len.Length)
209 {
210 throw new BadNetworkConsoleException("Invalid Packet Size");
211 }
212
213 byte[] packet = new byte[BitConverter.ToInt32(len, 0)];
214 read = stream.Read(packet, 0, packet.Length);
215
216 if (read != packet.Length)
217 {
218 throw new BadNetworkConsoleException("Invalid Packet");
219 }
220
222 }
223 else
224 {
225 Thread.Sleep(ConsoleWriteSleep);
226 }
227 }
228
229 if (!m_Client.Connected)
230 {
231 return;
232 }
233
234 NetworkStream str = m_Client.GetStream();
235 List<byte> packetData = new List<byte>();
236 byte[] packetBytes = BadConsoleDisconnectPacket.Packet.Serialize();
237 packetData.AddRange(BitConverter.GetBytes(packetBytes.Length));
238 packetData.AddRange(packetBytes);
239 str.Write(packetData.ToArray(), 0, packetData.Count);
240 m_Client.Dispose();
241 }
242
246 private void SendHeartBeat()
247 {
248 byte[] packetData = BadConsoleHeartBeatPacket.Packet.Serialize();
249 List<byte> packet = new List<byte>();
250 packet.AddRange(BitConverter.GetBytes(packetData.Length));
251 packet.AddRange(packetData);
252 m_Client.GetStream().Write(packet.ToArray(), 0, packet.Count);
253 }
254
258 private void Write()
259 {
260 DateTime lastHeartBeat = DateTime.Now;
261
262 while (!m_ExitRequested)
263 {
264 Task<string> task = Task.Run(Console.ReadLine);
265
266 while (!m_ExitRequested && !task.IsCompleted)
267 {
268 if (lastHeartBeat + TimeSpan.FromMilliseconds(HeartBeatSendInterval) < DateTime.Now)
269 {
271 lastHeartBeat = DateTime.Now;
272 }
273
274 Thread.Sleep(ConsoleReadInputSleep);
275 }
276
277 if (m_ExitRequested)
278 {
279 break;
280 }
281
282 string message = task.Result ?? "client::disconnect";
283
284 if (message.StartsWith("client::"))
285 {
286 string cmd = message.Substring("client::".Length);
288
289 continue;
290 }
291
292 lastHeartBeat = DateTime.Now;
293 byte[] packetData = new BadConsoleReadPacket(message).Serialize();
294 List<byte> packet = new List<byte>();
295 packet.AddRange(BitConverter.GetBytes(packetData.Length));
296 packet.AddRange(packetData);
297 m_Client.GetStream().Write(packet.ToArray(), 0, packet.Count);
298 }
299
300 m_ReadThread = null;
301 }
302}
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:76
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.