예제 #1
0
        public void Start(ushort port)
        {
            EasyTcpClient selectedClient = null;

            using var server = new EasyTcpServer().Start(port);

            server.OnError       += (s, exception) => Console.WriteLine($"Server error: {exception.Message}");
            server.OnDataReceive += (s, message) =>
            {
                if (selectedClient == message.Client)
                {
                    Console.WriteLine(message.Decompress().ToString());
                }
            };

            while (true)
            {
                string command = Console.ReadLine();
                if (string.IsNullOrWhiteSpace(command))
                {
                    continue;
                }

                var args = command.Split(' ');
                command = args[0];

                ExecuteCommand(command, args.Skip(1).ToArray(), server, ref selectedClient);
            }
        }
예제 #2
0
        public void Start4()
        {
            ushort port = TestHelper.GetPort();

            using var server = new EasyTcpServer();
            server.Start(port);
        }
예제 #3
0
파일: Send.cs 프로젝트: zhouzu/EasyTcp
        public void Setup()
        {
            _port = TestHelper.GetPort();
            var server = new EasyTcpServer();

            server.Start(_port);
        }
예제 #4
0
        /// <summary>
        /// Start listening for new connections
        /// </summary>
        /// <param name="server"></param>
        /// <param name="endPoint"></param>
        /// <param name="dualMode">specifies if the socket is a dual-mode socket (IPv4 and IPv6)</param>
        /// <param name="backlog">the maximum length of the pending connections queue</param>
        public static EasyTcpServer Start(this EasyTcpServer server, IPEndPoint endPoint, bool dualMode = false,
                                          int backlog = 100)
        {
            if (server.IsRunning)
            {
                throw new Exception("Could not start server: server is already running");
            }
            if (endPoint == null)
            {
                throw new ArgumentException("Could not start server: endPoint is null");
            }
            if (dualMode && endPoint.AddressFamily != AddressFamily.InterNetworkV6)
            {
                throw new ArgumentException("Could not start server: use an ipv6 endpoint if using dualMode");
            }

            server.BaseSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            if (dualMode)
            {
                server.BaseSocket.DualMode = true;
            }
            server.BaseSocket.Bind(endPoint);
            server.BaseSocket.Listen(backlog);
            server.BaseSocket.BeginAccept(OnConnectUtil.OnClientConnect, server);
            server.IsRunning = true;
            return(server);
        }
예제 #5
0
        public void TestLargeArray()
        {
            ushort port = TestHelper.GetPort();

            using var server      = new EasyTcpServer().Start(port);
            server.OnDataReceive += async(sender, message) =>
            {
                var array = await message.ReceiveLargeArrayAsync();

                message.Client.Send(array.Length);
                await message.Client.SendLargeArrayAsync(array);
            };

            byte[] receivedArray = null;

            using var client      = new EasyTcpClient();
            client.OnDataReceive += (sender, message) => receivedArray = message.ReceiveLargeArray();
            Assert.IsTrue(client.Connect(IPAddress.Loopback, port));

            client.Send("first message");

            byte[] largeMessage = new byte[ushort.MaxValue * 10];
            for (int i = 0; i < largeMessage.Length; i++)
            {
                largeMessage[i] = 11;
            }

            client.SendLargeArray(largeMessage);
            TestHelper.WaitWhileTrue(() => receivedArray == null);
            Assert.IsTrue(receivedArray.SequenceEqual(largeMessage));
        }
예제 #6
0
        public void Stream1() //Client -> -(Stream)> Server     (Client sends message to server)
        {
            ushort port = TestHelper.GetPort();

            using var server = new EasyTcpServer().Start(port);

            using var client = new EasyTcpClient();
            Assert.IsTrue(client.Connect(IPAddress.Any, port));

            string testData = "123", data = null;

            server.OnDataReceive += (sender, message) => //Receive stream from client
            {
                using var stream = new MemoryStream();
                message.ReceiveStream(stream, compression: true);
                data = Encoding.UTF8.GetString(stream.ToArray());
            };

            //Send stream to server
            using var dataStream = new MemoryStream(Encoding.UTF8.GetBytes(testData));
            client.Send("Stream");
            client.SendStream(dataStream, compression: true);

            TestHelper.WaitWhileTrue(() => data == null);
            Assert.AreEqual(testData, data);
        }
예제 #7
0
파일: StreamSsl.cs 프로젝트: Tratos/EasyTcp
        public void Stream()
        {
            var    certificate = new X509Certificate2("certificate.pfx", "password");
            ushort port        = TestHelper.GetPort();

            using var server = new EasyTcpServer().UseSsl(certificate).Start(port);

            using var client = new EasyTcpClient().UseSsl("localhost", true);
            Assert.IsTrue(client.Connect(IPAddress.Any, port));

            string testData = "123", data = null;

            server.OnDataReceiveAsync += async(sender, message) =>  //Receive stream from client
            {
                await using var stream = new MemoryStream();
                message.ReceiveStream(stream);
                data = Encoding.UTF8.GetString(stream.ToArray());
            };

            //Send stream to server
            using var dataStream = new MemoryStream(Encoding.UTF8.GetBytes(testData));
            client.Send("Stream");
            client.SendStream(dataStream);

            TestHelper.WaitWhileTrue(() => data == null);
            Assert.AreEqual(testData, data);
        }
예제 #8
0
        public static void StartBasicServer()
        {
            var server = new EasyTcpServer().Start(Port); // Start server on port 5000. (See StartUtil for more options)

            /* Using the OnConnect event.
             * Gets triggered when an new client connects,
             * Has as parameter an EasyTcpClient, events and functions on this client can be used as in BasicClient.cs
             */

            server.OnConnect += (sender, client) =>
            {
                Console.WriteLine("Server: Client connected");
                Console.WriteLine($"Server: There are now {server.ConnectedClientsCount + 1} clients connected");
            };

            /* Using the OnDisconnect event.
             * Gets triggered when a client is disconnects (After the client is disconnected!)
             */
            server.OnDisconnect += (sender, client)
                                   => Console.WriteLine("Server: Client disconnected");

            /* Using the OnDataReceive event.
             * This gets triggered when any clients sends data,
             * remember: Events can also be set for 1 client (See BasicClient.cs)
             */
            server.OnDataReceive += OnDataReceive;

            /* OnError get triggered when an error occurs in the server code,
             * This includes errors in the events because these are triggered by the server
             */
            server.OnError += (sender, e) =>
                              Console.WriteLine($"Server: Error occured, message: {e.Message}");
        }
예제 #9
0
        public void Stream2() //Client -> Server -(Stream)> Client     (Client requests stream from server)
        {
            ushort port = TestHelper.GetPort();

            using var server = new EasyTcpServer();
            server.Start(port);

            string testData = "123", data = null;

            using var client = new EasyTcpClient();
            Assert.IsTrue(client.Connect(IPAddress.Any, port));

            server.OnDataReceive += (sender, message) => //Send stream if client requests
            {
                using var dataStream = new MemoryStream(Encoding.UTF8.GetBytes(testData));
                message.Client.Send("Stream");
                message.Client.SendStream(dataStream);
            };

            client.OnDataReceive += (sender, message) => //Receive stream from server
            {
                using var stream = new MemoryStream();
                message.ReceiveStream(stream);
                data = Encoding.UTF8.GetString(stream.ToArray());
            };
            client.Send("GetStream"); //Request stream

            TestHelper.WaitWhileTrue(() => data == null);
            Assert.AreEqual(testData, data);
        }
예제 #10
0
        public static void Run()
        {
            // Create server with logging enabled
            // Write log to console
            using var server      = new EasyTcpServer().UseServerLogging(Console.WriteLine).Start(Port);
            server.OnDataReceive += (s, message) => message.Client.Send("Hello client test!");

            // Create client with logging enabled
            using var client = new EasyTcpClient().UseClientLogging(Console.WriteLine);
            if (!client.Connect("127.0.0.1", Port))
            {
                return;
            }

            client.Send("Hello server!");
            Console.ReadLine();

            /* Custom logging,
             * only log connect/disconnect events
             */
            using var server2 = new EasyTcpServer().UseCustomServerLogging(logMessage =>
            {
                if (logMessage.Type == LoggingType.ClientConnected)
                {
                    Console.WriteLine(logMessage);
                }
                else if (logMessage.Type == LoggingType.ClientDisconnected)
                {
                    Console.WriteLine(logMessage);
                }
            });
        }
예제 #11
0
        public static void StartEchoServer()
        {
            var server = new EasyTcpServer().Start(Port); //Start server on port 5001

            // Send received data back
            server.OnDataReceive += (sender, message) => message.Client.Send(message.Data);
        }
예제 #12
0
        public void TestConnectedClients()
        {
            ushort port = TestHelper.GetPort();

            using var server = new EasyTcpServer().Start(port);
            Assert.IsEmpty(server.GetConnectedClients());

            using var client = new EasyTcpClient();
            client.Connect(IPAddress.Loopback, port);
            TestHelper.WaitWhileFalse(() => server.ConnectedClientsCount == 1);
            Assert.AreEqual(1, server.ConnectedClientsCount);

            using var client2 = new EasyTcpClient();
            client2.Connect(IPAddress.Loopback, port);
            TestHelper.WaitWhileFalse(() => server.ConnectedClientsCount == 2);
            Assert.AreEqual(2, server.ConnectedClientsCount);

            client.Dispose();
            TestHelper.WaitWhileTrue(() => server.ConnectedClientsCount == 2);
            Assert.AreEqual(1, server.ConnectedClientsCount);

            client2.Dispose();
            TestHelper.WaitWhileTrue(() => server.ConnectedClientsCount == 1);
            Assert.AreEqual(0, server.ConnectedClientsCount);
        }
예제 #13
0
파일: Server.cs 프로젝트: I0xAF/EasyTcp
        static void Main(string[] args)
        {
            Console.WriteLine("Server starting...");
            EasyTcpServer server = new EasyTcpServer(System.Reflection.Assembly.GetExecutingAssembly());

            server.OnServerStarted += (sender, s) =>
            {
                Console.WriteLine("Server started!");
            };
            server.ClientConnected += (sender, client) =>
            {
                Console.WriteLine($"Client [{client.RemoteEndPoint.ToString()}] connected!");
            };
            server.ClientDisconnected += (sender, client) =>
            {
                Console.WriteLine($"Client [{client.RemoteEndPoint.ToString()}] disconnected!");
            };
            server.DataReceived += (sender, msg) =>
            {
                Console.WriteLine($"PacketType: {msg.GetPacket.PacketType}");
                server.PacketHandler(msg, false);
            };
            server.OnError += (sender, ex) =>
            {
                Console.WriteLine($"{ex.Message}\n{ex.StackTrace}");
            };
            server.Start("127.0.0.1", 6124, 10);
            Task.Delay(-1).Wait();
        }
예제 #14
0
        public void Setup()
        {
            _port = TestHelper.GetPort();
            var server = new EasyTcpServer().Start(_port);

            server.OnDataReceive += (sender, message) => message.Client.Send(message.Data);
        }
예제 #15
0
        private static void StartServer(int port)
        {
            try
            {
                server = new EasyTcpActionServer();
                server.Start(Port);

                bool exit = false;

                Console.WriteLine($">> Server started on ip: {LocalIP} (public ip adress: {PublicIP})!");
                Console.WriteLine($">> Server started listening to port {port}!");
                Console.WriteLine(">> Press escape to close the server ...");
                while (!exit)
                {
                    ConsoleKeyInfo key = Console.ReadKey(true);
                    if (key.Key == ConsoleKey.Escape)
                    {
                        exit = true;
                    }
                }

                server.Dispose();

                Console.WriteLine(Environment.NewLine + ">> Server closed! Press any key to close the window ...");
                Console.ReadKey(true);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
예제 #16
0
        public static void StartBasicServer()
        {
            var server = new EasyTcpServer();

            /* OnConnect event,
             * triggered when a new client connects to server
             */
            server.OnConnect += (object sender, EasyTcpClient client) =>
            {
                Console.WriteLine($"Server: Client {server.ConnectedClientsCount} connected");
                client.Send("Welcome to the server!");
            };

            /* OnDisconnect event,
             * triggered when a client disconnects from the server
             */
            server.OnDisconnect += (object sender, EasyTcpClient client)
                                   => Console.WriteLine("Server: Client disconnected");

            /* OnDataReceive event,
             * triggered when server receives data from any client
             */
            server.OnDataReceive += OnDataReceive;

            /* OnError event,
             * triggered when an unexpected error occurs withing the servers code or in any event
             * error is thrown when ignored
             */
            server.OnError += (object sender, Exception e) =>
                              Console.WriteLine($"Server: Error occured, message: {e.Message}");

            Console.WriteLine("Press enter to shutdown basic server...");
            Console.ReadLine();
        }
예제 #17
0
        public async Task Stream1() //Client -> -(Stream)> Server     (Client sends message to server)
        {
            ushort port = TestHelper.GetPort();

            using var server = new EasyTcpServer();
            server.Start(port);

            using var client = new EasyTcpClient();
            Assert.IsTrue(client.Connect(IPAddress.Any, port));

            string testData = "123", data = "";

            server.OnDataReceiveAsync += async(sender, message) =>  //Receive stream from client
            {
                await using var stream = new MemoryStream();
                await message.ReceiveStreamAsync(stream);

                data = Encoding.UTF8.GetString(stream.ToArray());
            };

            //Send stream to server
            await using var dataStream = new MemoryStream(Encoding.UTF8.GetBytes(testData));
            client.Send("Stream");
            await client.SendStreamAsync(dataStream);

            TestHelper.WaitWhileTrue(() => data == "");
            Assert.AreEqual(testData, data);
        }
예제 #18
0
        public void OnDataReceive2()
        {
            // Example receiving for the client
            ushort port = TestHelper.GetPort();

            using var server = new EasyTcpServer();
            server.Start(port);

            using var client = new EasyTcpClient();
            Assert.IsTrue(client.Connect(IPAddress.Any, port));

            const string message      = "Hello client!";
            int          receiveCount = 0;

            client.OnDataReceive += (sender, receivedMessage) =>
            {
                //Async lambda, so thread safe increase integer
                if (message.Equals(receivedMessage.ToString()))
                {
                    Interlocked.Increment(ref receiveCount);
                }
                Console.WriteLine($"[{receiveCount}]Received message: {receivedMessage.ToString()}");
            };

            server.SendAll(message);
            server.SendAll(message);

            TestHelper.WaitWhileTrue(() => receiveCount < 2);
            Assert.AreEqual(2, receiveCount);
        }
예제 #19
0
        public void Execute(Message msg, EasyTcpServer server)
        {
            Packet        pack = msg.GetPacket;
            List <object> objs = BytesTransformation.TransformToObject(BytesCompress.Decompress(pack.RawData), typeof(string));

            ServerEvents.Debug?.Invoke($"Command Received: {objs[0].ToString()}");
            MainLogic.GetInstance.Exec.CommandHandler(objs[0].ToString(), msg.Socket);
        }
예제 #20
0
 /// <summary>
 /// Send action (byte[]) to connected clients
 /// </summary>
 /// <param name="server"></param>
 /// <param name="action">action code</param>
 /// <param name="data">data to send to connected clients</param>
 /// <param name="compression">compress data using GZIP if set to true</param>
 public static void SendAllAction(this EasyTcpServer server, int action, byte[] data = null, bool compression = false)
 {
     if (compression && data != null)
     {
         data = CompressionUtil.Compress(data);
     }
     server.SendAll(BitConverter.GetBytes(action), data);
 }
예제 #21
0
 /// <summary>
 /// Send data (byte[]) to connected clients
 /// </summary>
 /// <param name="server"></param>
 /// <param name="data">data to send to connected clients</param>
 /// <param name="compression">compress data using GZIP if set to true</param>
 public static void SendAll(this EasyTcpServer server, byte[] data, bool compression = false)
 {
     if (compression)
     {
         data = CompressionUtil.Compress(data);
     }
     server.SendAll(dataArray: data);
 }
예제 #22
0
        public void Execute(Message msg, EasyTcpServer server)
        {
            Console.WriteLine($"Received packet!");
            Packet        pack    = msg.GetPacket;
            List <object> Objects = BytesTransformation.TransformToObject(BytesCompress.Decompress(pack.RawData), typeof(string), typeof(string));

            Console.WriteLine($"LOGIN: {Objects[0].ToString()} | PASSWORD: {Objects[1].ToString()}");
        }
예제 #23
0
파일: Connect.cs 프로젝트: Job79/EasyTcp
        public void ConnectIPAddressString()
        {
            var port = TestHelper.GetPort();

            using var server = new EasyTcpServer().Start(port);
            using var client = new EasyTcpClient();

            Assert.IsTrue(client.Connect("127.0.0.1", port));
            Assert.IsTrue(client.IsConnected());
        }
예제 #24
0
파일: Connect.cs 프로젝트: Job79/EasyTcp
        public void ConnectIPAddress()
        {
            var port = TestHelper.GetPort();

            using var server = new EasyTcpServer().Start(port);
            using var client = new EasyTcpClient();

            Assert.IsTrue(client.Connect(IPAddress.Loopback, port));
            Assert.IsTrue(client.IsConnected());
        }
예제 #25
0
        private static void OnDataReceive(object sender, Message message)
        {
            Console.WriteLine($"Server: Received data, received: {message}");
            Console.WriteLine("Server: Broadcasting received data");

            EasyTcpClient client = message.Client;        // Get client from message
            EasyTcpServer server = (EasyTcpServer)sender; // Convert sender to server or client

            server.SendAll(message);
        }
예제 #26
0
 /// <summary>
 /// Start listening for new connections
 /// </summary>
 /// <param name="server"></param>
 /// <param name="ipAddress">ipAddress as string</param>
 /// <param name="port"></param>
 /// <param name="dualMode">Specifies if the socket is a dual-mode socket (Ipv4 and Ipv6)</param>
 /// <param name="backlog">The maximum length of the pending connections queue</param>
 public static EasyTcpServer Start(this EasyTcpServer server, string ipAddress, ushort port,
                                   bool dualMode = false,
                                   int backlog   = 100)
 {
     if (!IPAddress.TryParse(ipAddress, out IPAddress address))
     {
         throw new ArgumentException("Could not start server: ipAddress is not a valid IPv4/IPv6 address");
     }
     return(Start(server, new IPEndPoint(address, Math.Max(port, (ushort)1)), dualMode, backlog));
 }
예제 #27
0
        public async Task ConnectAsyncEndpoint()
        {
            var port = TestHelper.GetPort();

            using var server = new EasyTcpServer().Start(port);
            using var client = new EasyTcpClient();

            Assert.IsTrue(await client.ConnectAsync(new IPEndPoint(IPAddress.Loopback, port)));
            Assert.IsTrue(client.IsConnected());
        }
예제 #28
0
파일: Ssl.cs 프로젝트: Tratos/EasyTcp
        public void TestInvalidCertificate()
        {
            ushort port        = TestHelper.GetPort();
            var    certificate = new X509Certificate2("certificate.pfx", "password");

            using var server = new EasyTcpServer().UseSsl(certificate).Start(port);

            using var client = new EasyTcpClient().UseSsl("localhost");
            Assert.IsFalse(client.Connect("127.0.0.1", port));
        }
예제 #29
0
 /// <summary>
 /// Send data to all connected clients
 /// </summary>
 /// <param name="server"></param>
 /// <param name="dataArray">data to send to connected clients</param>
 public static void SendAll(this EasyTcpServer server, params byte[][] dataArray)
 {
     if (server == null || !server.IsRunning)
     {
         throw new Exception("Could not send data: server not running or null");
     }
     foreach (var client in server.GetConnectedClients())
     {
         client.Protocol.SendMessage(client, dataArray);
     }
 }
예제 #30
0
        public void Start3()
        {
            ushort port = TestHelper.GetPort();

            using var server = new EasyTcpServer().Start("127.0.0.1", port);

            //Start with dualMode socket
            ushort port2 = TestHelper.GetPort();

            using var server2 = new EasyTcpServer().Start("::1", port2, true);
        }