diff --git a/sandbox/poc/network_test/Client.cs b/sandbox/poc/network_test/Client.cs new file mode 100644 index 0000000000000000000000000000000000000000..b0ee10f8a72911ae4c33fca0032dcaa4be9441c0 --- /dev/null +++ b/sandbox/poc/network_test/Client.cs @@ -0,0 +1,87 @@ +using Newtonsoft.Json; +using System; +using System.Net.Sockets; +using System.Text; +using System.Threading; + +namespace network_test +{ + class Client + { + TcpClient clientSocket; + + public Client() + { + //create a TCP Client + this.clientSocket = new TcpClient(); + } + + public void run(string ip, int port) + { + //try to connect + do + { + try + { + this.clientSocket.Connect(ip, port); + } + catch (SocketException e) + { + Console.WriteLine(e.Message); + } + } while (!this.clientSocket.Connected); + + //listen to server + Thread tcpListenerThread = new Thread(receiveMessage); + tcpListenerThread.Start(); + + //send message to the server + string text; + do + { + text = Console.ReadLine(); + try + { + sendMessage(text); + }catch (Exception e) + { + Console.WriteLine(e.Message); + text = "/quit"; + } + } while (text != "/quit"); + + //quit + //Console.ReadLine(); + tcpListenerThread.Abort(); + this.clientSocket.Close(); + } + + private void sendMessage(string text) + { + Message msg = new Message(text, "client"); + NetworkStream nwStream = this.clientSocket.GetStream(); + byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(JsonConvert.SerializeObject(msg)); + nwStream.Write(bytesToSend, 0, bytesToSend.Length); + } + + private void receiveMessage() + { + while (true) + { + try + { + byte[] bytesToRead = new byte[this.clientSocket.ReceiveBufferSize]; + NetworkStream nwStream = this.clientSocket.GetStream(); + int bytesRead = nwStream.Read(bytesToRead, 0, this.clientSocket.ReceiveBufferSize); + Message resp = JsonConvert.DeserializeObject<Message>(Encoding.ASCII.GetString(bytesToRead, 0, bytesRead)); + resp.print(); + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + } + } + } +} + diff --git a/sandbox/poc/network_test/Message.cs b/sandbox/poc/network_test/Message.cs new file mode 100644 index 0000000000000000000000000000000000000000..4b56623f7dec43d762b5a151c04127c558183a8f --- /dev/null +++ b/sandbox/poc/network_test/Message.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace network_test { + class Message { + public string content; + public string sender; + public DateTime date; + + public Message(string content = "", string sender = "") { + this.content = content; + this.sender = sender; + this.date = DateTime.Now; + } + + public void print() + { + Console.WriteLine("[" + this.date.ToString() + "] " + sender + " : " + content); + } + } +} diff --git a/sandbox/poc/network_test/Program.cs b/sandbox/poc/network_test/Program.cs new file mode 100644 index 0000000000000000000000000000000000000000..f895614894e649a58a0d557b282d843fee9d0c56 --- /dev/null +++ b/sandbox/poc/network_test/Program.cs @@ -0,0 +1,30 @@ +using System; + +namespace network_test +{ + class Program + { + static void Main(string[] args) + { + string ip = "127.0.0.1"; + int port = 10000; + string choice; + do + { + Console.WriteLine("s : server\nc : client\n"); + choice = Console.ReadLine(); + } while (choice != "c" && choice != "s"); + + if (choice == "s") + { + Server server = new Server(); + server.run(ip, port); + } + else + { + Client client = new Client(); + client.run(ip, port); + } + } + } +} diff --git a/sandbox/poc/network_test/Server.cs b/sandbox/poc/network_test/Server.cs new file mode 100644 index 0000000000000000000000000000000000000000..810046133e17016a3419ab7d4d2885adce6ca645 --- /dev/null +++ b/sandbox/poc/network_test/Server.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Concurrent; +using System.Text; +using System.Threading; +using System.Net.Sockets; +using System.Net; +using Newtonsoft.Json; + +namespace network_test +{ + class Server + { + int currentId; //id given to the client + ConcurrentBag<ClientHandler> clients; + public Server() + { + this.currentId = 0; + this.clients = new ConcurrentBag<ClientHandler>(); + } + + public void run(string ip, int port) + { + + //setup server + TcpListener listener = new TcpListener(IPAddress.Parse(ip), port); + TcpClient client = default; + listener.Start(); + Console.WriteLine("Listening..."); + + //handle stop server + Console.CancelKeyPress += delegate { + Console.WriteLine("Quit"); + listener.Stop(); + }; + + //listen to new clients + while (true) + { + client = listener.AcceptTcpClient(); + //start new Thread + clients.Add(new ClientHandler(client, this.currentId++, this)); + + } + } + + public void broadcast(Message msg) + { + foreach (var client in this.clients) + { + client.sendMessage(msg); + } + } + } + + class ClientHandler + { + TcpClient client; + int id; + Server server; + public ClientHandler(TcpClient client, int id, Server server) + { + this.id = id; + this.client = client; + this.server = server; + //this.server = server; + Console.WriteLine("Client " + id + " connected"); + Thread thread = new Thread(handling); + thread.Start(); + } + + private void handling() + { + while (true) + { + try + { + //read message + Message msg = this.receiveMessage(); + msg.sender = "Client " + id; + msg.print(); + this.server.broadcast(msg); + } + catch (Exception) + { + Console.WriteLine("Client " + this.id + " disconnected"); + break; + } + } + } + + private Message receiveMessage() + { + NetworkStream nwStream = this.client.GetStream(); + byte[] buffer = new byte[this.client.ReceiveBufferSize]; + int bytesRead = nwStream.Read(buffer, 0, this.client.ReceiveBufferSize); + Message msg = JsonConvert.DeserializeObject<Message>(Encoding.ASCII.GetString(buffer, 0, bytesRead)); + return msg; + } + + public void sendMessage(Message msg) + { + try + { + NetworkStream nwStream = this.client.GetStream(); + byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(JsonConvert.SerializeObject(msg)); + nwStream.Write(bytesToSend, 0, bytesToSend.Length); + }catch (Exception e) + { + Console.WriteLine(e.Message); + } + } + } +}