示例#1
0
        /// <summary>
        /// This method starts the polling Timer each time the service is started
        /// </summary>
        protected override void OnStart(string[] args)
        {
            //Create a log file writer, so you can see the flow easily.
            //It can be printed. Makes it easier to figure out complex program flow.
            //The log StreamWriter uses a buffer. So it will only work right if you close
            //the server console properly at the end of the test.
            log = new Log(consoleWatch);

            try
            {
                // Get endpoint for the listener.
                IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse(DEFAULT_SERVER), DEFAULT_PORT);

                //This object holds a lot of settings that we pass from Main method
                //to the SocketListener. In a real app, you might want to read
                //these settings from a database or windows registry settings that
                //you would create.
                SocketListenerSettings theSocketListenerSettings =
                    new SocketListenerSettings
                        (maxNumberOfConnections, excessSaeaObjectsInPool, maxSimultaneousAcceptOps, testBufferSize, opsToPreAlloc, localEndPoint);

                listener = new SocketListener(theSocketListenerSettings, log);
                listener.Start(new IPEndPoint(IPAddress.Parse("127.0.0.1"), DEFAULT_PORT));

                log.WriteLine("Server listening on port {0}. Press any key to terminate the server process..." + DEFAULT_PORT);
            }
            catch (Exception ex)
            {
                log.WriteLine(ex.ToString());
            }
        }
示例#2
0
        public void ConnectivityBaseTest(int listeningPort)
        {
            ICommunicationChannel clientHandler = Substitute.For <ICommunicationChannel>();

            ServiceLocator.Current.GetInstance <IUnityContainer>().RegisterInstance(clientHandler);

            ApplicationContext applicationContext = new ApplicationContext()
            {
                Container = (UnityContainer)ServiceLocator.Current.GetInstance <IUnityContainer>()
            };

            ILoggerService loggerService = Substitute.For <ILoggerService>();

            IBufferManagerFactory          bufferManagerFactory = Substitute.For <IBufferManagerFactory>();
            ServerCommunicationServiceBase communicationHub     = new TcpCommunicationService(applicationContext, loggerService, bufferManagerFactory, null, null);

            IPEndPoint             communicationEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), listeningPort);
            SocketListenerSettings settings = new SocketListenerSettings(1, 100, communicationEndPoint);

            communicationHub.Init(settings);
            communicationHub.Start();

            TcpClient tcpClient = new TcpClient();

            tcpClient.Connect(communicationEndPoint.Address, communicationEndPoint.Port);

            Assert.True(tcpClient.Connected);
        }
示例#3
0
        /// <summary>
        ///  没作用
        /// </summary>
        public void InitSocketServer()
        {
            try
            {
                // Setup delegate
                SocketAsyncServer.Program.QueryWork = new QueryEventHandler(QueryDataBase);

                // Load parameters from configuration //
                string         iniPath        = System.IO.Directory.GetCurrentDirectory() + "\\SystemSettings.ini";
                DM_MES.IniFile iniFile        = new DM_MES.IniFile(iniPath);
                int            Port           = iniFile.ReadInt("PDAServer", "Port", 4444);
                int            maxConnections = iniFile.ReadInt("PDAServer", "MaxConnections", 3000);
                int            bufferSize     = iniFile.ReadInt("PDAServer", "BufferSize", 2048);

                // Create BarCode of server //生成条形码
                System.Net.IPHostEntry myEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName());
                string strHost = myEntry.AddressList[1].ToString();
                strHost += ":" + Port;
                Image imgHost = SocketAsyncServer.Code128Rendering.MakeBarcodeImage(strHost, 1, true);
                this.pictBarCode.Image = imgHost;

                // Get endpoint for the listener.
                IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, Port);

                // This object holds a lot of settings that we pass from Main method
                // to the SocketListener. In a real app, you might want to read
                // these settings from a database or windows registry settings that
                // you would create.
                SocketListenerSettings theSocketListenerSettings = new SocketListenerSettings(
                    maxConnections,
                    bufferSize,
                    localEndPoint,
                    "");

                // Instantiate the SocketListener.
                asyncServer = new SocketListener(theSocketListenerSettings); //tcp异步服务监听
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
示例#4
0
        public void TestConnection()
        {
            var listenSettings = new SocketListenerSettings <IListenerStateData>
            {
                LocalEndPoint                   = new IPEndPoint(IPAddress.Any, TestPort),
                MaxConnections                  = 10,
                MaxPendingConnections           = 1000,
                MaxSimultaneousAcceptOperations = 2,
                IoBufferSize             = 4096,
                ExcessConnectionHandlers = 5,
                ConnectionTimeOut        = 100000,
                WatchDogCheckDelay       = 10 * 1000,           // 5 seconds
                MaxTaskConcurrencyLevel  = 10,
                MaxTaskDelay             = 3000,
            };

            var mockMessageHandler = new TestMessageHandler <TestingSocketStateData, IListenerStateData>();

            using (var socketListener = new SocketListener <TestingSocketStateData, IListenerStateData>(listenSettings, mockMessageHandler))
            {
                socketListener.StartListen();

                using (var socket = new TcpClient())
                {
                    socket.Connect("localhost", TestPort);

                    using (var stream = socket.GetStream())
                    {
                        SendMessage(stream,
                                    "GET /process.aspx?data=351777047213077|OGeNuj4NrSR00cY96P5E3Rc04h120Qd-000O001n0c1x HTTP/1.1\r\n" +
                                    "Host: 10.1.224.2\r\n" +
                                    "\r\n");

                        WaitForResponse(stream);

                        Assert.AreEqual(1, mockMessageHandler.HandledMessages);
                    }
                }
            }
        }
示例#5
0
        public void TestConnectionCloseAfterProcess(bool sendDataInResponse, bool disconnectOnceDone)
        {
            var listenSettings = new SocketListenerSettings <IListenerStateData>
            {
                LocalEndPoint                   = new IPEndPoint(IPAddress.Any, TestPort),
                MaxConnections                  = 10,
                MaxPendingConnections           = 1000,
                MaxSimultaneousAcceptOperations = 2,
                IoBufferSize             = 4096,
                ExcessConnectionHandlers = 5,
                ConnectionTimeOut        = 100000,
                WatchDogCheckDelay       = 10 * 1000,           // 5 seconds
                MaxTaskConcurrencyLevel  = 10,
                MaxTaskDelay             = 3000,
            };

            var mockMessageHandler = new Moq.Mock <IMessageHandler <TestingSocketStateData, IListenerStateData> >();

            mockMessageHandler.Setup(x => x.IsMessageComplete(It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>(), It.IsAny <int>(), It.IsAny <TestingSocketStateData>())).Returns(() => true);
            mockMessageHandler.Setup(x => x.HandleMessage(It.IsAny <IPEndPoint>(), It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>(), It.IsAny <IListenerStateData> (), It.IsAny <TestingSocketStateData>()))
            .Returns(() => new HandleMessageResponse {
                DisconnectOnceDone = disconnectOnceDone, ToSend = sendDataInResponse ? Encoding.ASCII.GetBytes("hello") : null
            });

            using (var socketListener = new SocketListener <TestingSocketStateData, IListenerStateData>(listenSettings, mockMessageHandler.Object))
            {
                socketListener.StartListen();

                using (var socket = new TcpClient())
                {
                    socket.Connect("localhost", TestPort);

                    using (var stream = socket.GetStream())
                    {
                        SendMessage(stream, "hi");

                        stream.ReadTimeout = 3000;

                        var  bytes        = new byte[2000];
                        int  readLength   = -1;
                        bool hadException = false;
                        try
                        {
                            readLength = stream.Read(bytes, 0, bytes.Length);
                        }
                        catch (IOException)
                        {
                            hadException = true;
                        }

                        bool hadException2 = false;
                        try
                        {
                            stream.Read(bytes, 0, bytes.Length);
                        }
                        catch (IOException)
                        {
                            hadException2 = true;
                        }

                        if (sendDataInResponse && disconnectOnceDone)
                        {
                            //Get data
                            Assert.AreEqual(5, readLength);
                            //Get disconnected on second read.
                            Assert.IsFalse(hadException2);
                        }

                        if (!sendDataInResponse && disconnectOnceDone)
                        {
                            //Get data
                            Assert.AreEqual(0, readLength);
                            //Get disconnected on second read.
                            Assert.IsFalse(hadException2);
                        }

                        if (!sendDataInResponse && !disconnectOnceDone)
                        {
                            //Get data, but never executed due to exception
                            Assert.AreEqual(-1, readLength);
                            //Get disconnected and there was no data to read.
                            Assert.IsTrue(hadException);
                            Assert.IsTrue(hadException2);
                        }

                        if (sendDataInResponse && !disconnectOnceDone)
                        {
                            //Get data
                            Assert.AreEqual(5, readLength);
                            //Get disconnected on second read.
                            Assert.IsFalse(hadException);
                            Assert.IsTrue(hadException2);
                        }
                    }
                }
            }
        }
示例#6
0
        public void ReusedBufferIsEmpty()
        {
            var listenSettings = new SocketListenerSettings <IListenerStateData>
            {
                LocalEndPoint                   = new IPEndPoint(IPAddress.Any, TestPort),
                MaxConnections                  = 2,
                ExcessConnectionHandlers        = 10,
                MaxPendingConnections           = 1000,
                MaxSimultaneousAcceptOperations = 1,
                IoBufferSize            = 4096,
                ConnectionTimeOut       = 5000,
                WatchDogCheckDelay      = 2000,
                MaxTaskConcurrencyLevel = 10,
                MaxTaskDelay            = 3000,
            };
            const double ticksPerSecond     = 10000000.0;
            var          mockMessageHandler = new TestMessageHandler <TestingSocketStateData, IListenerStateData>();
            Mock <IServerTrace <IListenerStateData> > tracer = new Mock <IServerTrace <IListenerStateData> >();

            tracer.Setup(x => x.Sending(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <IPEndPoint>(), It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>()))
            .Callback <IListenerStateData, IdentityUserToken, IPEndPoint, byte[], int, int>((f, a, b, c, d, e) => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Sending {c} bytes"));
            tracer.Setup(x => x.Sent(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <IPEndPoint>(), It.IsAny <int>()))
            .Callback <IListenerStateData, IdentityUserToken, IPEndPoint, int>((f, a, b, c) => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Sent {c} bytes"));
            tracer.Setup(x => x.TimingOutConnection(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <IPEndPoint>(), It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>(), It.IsAny <double>(), It.IsAny <double>(), It.IsAny <double>(), It.IsAny <double>()))
            .Callback(() => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Timed out connection."));
            tracer.Setup(x => x.StartListen(It.IsAny <SocketListenerSettings <IListenerStateData> >()))
            .Callback <SocketListenerSettings <IListenerStateData> >(a => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Listener started: {JsonConvert.SerializeObject(a)}"));
            tracer.Setup(x => x.Dispose(It.IsAny <IListenerStateData>()))
            .Callback(() => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Disposed."));
            tracer.Setup(x => x.QueuedTask(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>()))
            .Callback(() => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Task Queued"));
            tracer.Setup(x => x.StartingTask(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <DateTime>()))
            .Callback(() => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Task Started"));
            tracer.Setup(x => x.FailedTask(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <Exception>()))
            .Callback(() => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Task Failed"));
            tracer.Setup(x => x.ExpiredTask(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>()))
            .Callback(() => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Task Expired"));
            tracer.Setup(x => x.CompletedTask(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>()))
            .Callback(() => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Task Completed"));
            tracer.Setup(x => x.Received(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <IPEndPoint>(), It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <int>()))
            .Callback <IListenerStateData, IdentityUserToken, IPEndPoint, byte[], int, int>((f, a, b, c, d, e) => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Data Received: {e}"));
            tracer.Setup(x => x.HandleAccept(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <IPEndPoint>()))
            .Callback <IListenerStateData, IdentityUserToken, IPEndPoint>((f, a, b) => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Connection accepted"));
            tracer.Setup(x => x.HandleBadAccept(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <IPEndPoint>(), It.IsAny <SocketError>()))
            .Callback(() => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Bad SocketAccept"));
            tracer.Setup(x => x.ClosingConnection(It.IsAny <IListenerStateData>(), It.IsAny <IdentityUserToken>(), It.IsAny <IPEndPoint>(), It.IsAny <bool>(), It.IsAny <bool>(), It.IsAny <SocketError>()))
            .Callback <IListenerStateData, IdentityUserToken, IPEndPoint, bool, bool, SocketError>((f, a, b, c, d, e) => Console.WriteLine($"S[{DateTime.Now.Ticks / ticksPerSecond}]Closing Connection: ToldToClose: {c} ClosedByClient:{d} CloseReason:{e}"));

            using (var socketListener = new SocketListener <TestingSocketStateData, IListenerStateData>(listenSettings, mockMessageHandler, tracer.Object))
            {
                socketListener.StartListen();

                var socket1 = new TcpClient();
                socket1.Connect("localhost", TestPort);

                var stream1 = socket1.GetStream();
                SendMessage(stream1,
                            "GET /process.aspx?data=351777047213077|OGeNuj4NrSR00cY96P5E3Rc04h120Qd-000O001n0c1x HTTP/1.1\r\n" +
                            "Host: 10.1.224.2\r\n" +
                            "\r\n");
                Console.WriteLine($"C[{DateTime.Now.Ticks / ticksPerSecond}]Waiting for data.");
                WaitForResponse(stream1);
                Console.WriteLine($"C[{DateTime.Now.Ticks / ticksPerSecond}]Data received, checking that there is no data left.");
                WaitForNoResponse(stream1);
                Console.WriteLine($"C[{DateTime.Now.Ticks / ticksPerSecond}]No data left.");
                Thread.Sleep(1000);
                Task.Delay(1000);
                Assert.AreEqual(1, mockMessageHandler.HandledMessages);
                stream1.Close();
                socket1.Close();

                Console.WriteLine();
                Thread.Sleep(1000);

                using (var socket = new TcpClient())
                {
                    socket.Connect("localhost", TestPort);

                    using (var stream = socket.GetStream())
                    {
                        SendMessage(stream, "");
                        WaitForNoResponse(stream);
                        Console.WriteLine($"C[{DateTime.Now.Ticks / ticksPerSecond}]Waiting for no response.");
                        Assert.AreEqual(1, mockMessageHandler.HandledMessages);
                    }
                }

                using (var socket = new TcpClient())
                {
                    socket.Connect("localhost", TestPort);

                    using (var stream = socket.GetStream())
                    {
                        SendMessage(stream, "");
                        WaitForNoResponse(stream);
                        Console.WriteLine($"C[{DateTime.Now.Ticks / ticksPerSecond}]Waiting for no response.");
                        Assert.AreEqual(1, mockMessageHandler.HandledMessages);
                    }
                }

                using (var socket = new TcpClient())
                {
                    socket.Connect("localhost", TestPort);

                    using (var stream = socket.GetStream())
                    {
                        SendMessage(stream,
                                    "GET /process.aspx?data=351777047213077|OGeNuj4NrSR00cY96P5E3Rc04h120Qd-000O001n0c1x HTTP/1.1\r\n" +
                                    "Host: 10.1.224.2\r\n" +
                                    "\r\n");
                        Console.WriteLine($"C[{DateTime.Now.Ticks / ticksPerSecond}]Waiting for final data.");
                        try
                        {
                            WaitForResponse(stream);
                        }
                        catch (Exception)
                        {
                            Console.WriteLine($"C[{DateTime.Now.Ticks / ticksPerSecond}]Final data exception thrown.");
                            throw;
                        }

                        Console.WriteLine($"C[{DateTime.Now.Ticks / ticksPerSecond}]Final data received.");
                        Assert.AreEqual(2, mockMessageHandler.HandledMessages);
                    }
                }
            }
        }