/// <summary>
        /// 获取 申请新号码的 反馈消息.
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        private NewWorkNumberRespond GetNewWorkNumberRespond(NewWorkNumberRequest request)
        {
            NewWorkNumberRespond result = new NewWorkNumberRespond()
            {
                // 请求号码
                ResultWorkNumber = queueManager.GetNewWorkNumber(request.ServiceCode),
                // 队列首号码.
                TopWorkNumber = queueManager.GetTopWorkNumber(request.ServiceCode),
                // 队列长度.
                QueueLength = queueManager.GetWorkNumberCount(request.ServiceCode),
            };

            return(result);
        }
예제 #2
0
        public void MessageProcessTest()
        {
            // 请求5个号码.
            for (uint i = 0; i < 5; i++)
            {
                QueuingMachineMessage message = new QueuingMachineMessage()
                {
                    Header = new MessageHeader()
                    {
                        CommandID  = MessageHeader.QM_NewWorkNumber_Req,
                        SequenceNo = i,
                    },
                    Body = new NewWorkNumberRequest()
                    {
                        ServiceCode = "A",
                    },
                };


                // 处理消息.
                QueuingMachineMessage resultMessage = processer.DoMessageProcess(message);

                // 结果消息非空.
                Assert.IsNotNull(resultMessage);

                // 核对消息头.
                // 核对 消息反馈类型.
                Assert.AreEqual(MessageHeader.QM_NewWorkNumber_Resp, resultMessage.Header.CommandID);
                // 核对 流水号.
                Assert.AreEqual(i, resultMessage.Header.SequenceNo);


                // 核对消息体.
                Assert.IsInstanceOf <NewWorkNumberRespond>(resultMessage.Body);

                NewWorkNumberRespond body = resultMessage.Body as NewWorkNumberRespond;
                // 叫号代码.
                Assert.AreEqual("A0000" + (i + 1), body.ResultWorkNumber);
                // 队列首代码.
                Assert.AreEqual("A00001", body.TopWorkNumber);
                // 队列长度.
                Assert.AreEqual(i + 1, body.QueueLength);
            }


            // 消费5个号码.
            for (uint i = 0; i < 5; i++)
            {
                QueuingMachineMessage message = new QueuingMachineMessage()
                {
                    Header = new MessageHeader()
                    {
                        CommandID  = MessageHeader.QM_AskWorkNumber_Req,
                        SequenceNo = i,
                    },
                    Body = new AskWorkNumberRequest()
                    {
                        ServiceCode = "A",
                    },
                };

                // 处理消息.
                QueuingMachineMessage resultMessage = processer.DoMessageProcess(message);

                // 结果消息非空.
                Assert.IsNotNull(resultMessage);

                // 核对消息头.
                // 核对 消息反馈类型.
                Assert.AreEqual(MessageHeader.QM_AskWorkNumber_Resp, resultMessage.Header.CommandID);
                // 核对 流水号.
                Assert.AreEqual(i, resultMessage.Header.SequenceNo);


                // 核对消息体.
                Assert.IsInstanceOf <AskWorkNumberRespond>(resultMessage.Body);
                AskWorkNumberRespond body = resultMessage.Body as AskWorkNumberRespond;
                // 叫号代码.
                Assert.AreEqual("A0000" + (i + 1), body.ResultWorkNumber);
            }
        }
예제 #3
0
        /// <summary>
        /// 发送请求消息.
        /// </summary>
        /// <param name="code"></param>
        private void SendMessage(string code)
        {
            QueuingMachineMessage message = new QueuingMachineMessage()
            {
                Header = new MessageHeader()
                {
                    CommandID  = MessageHeader.QM_NewWorkNumber_Req,
                    SequenceNo = sequenceNo++,
                },
                Body = new NewWorkNumberRequest()
                {
                    ServiceCode = code,
                },
            };



            // 第一个参数:AddressFamily  = 指定 Socket 类的实例可以使用的寻址方案。
            //     Unspecified 未指定地址族。
            //     InterNetwork IP 版本 4 的地址。
            //     InterNetworkV6 IP 版本 6 的地址。
            //
            // 第二个参数:SocketType = 指定 Socket 类的实例表示的套接字类型。
            //     Stream 一个套接字类型,支持可靠、双向、基于连接的字节流,而不重复数据,也不保留边界。
            //            此类型的 Socket 与单个对方主机通信,并且在通信开始之前需要建立远程主机连接。
            //            此套接字类型使用传输控制协议 (Tcp),AddressFamily 可以是 InterNetwork,也可以是 InterNetworkV6。
            //
            // 第三个参数:ProtocolType = 指定 Socket 类支持的协议。
            //     Tcp 传输控制协议 (TCP)。
            Socket mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                //  尝试连接主机.
                mySocket.Connect(ephost);

                // 发送消息.
                SocketMessageSender sender = new SocketMessageSender();
                sender.Socket = mySocket;
                sender.SendMessage(message);


                // 接收消息.
                SocketMessageReceiver receiver = new SocketMessageReceiver();
                receiver.Socket = mySocket;
                QueuingMachineMessage resultMessage = receiver.ReceiveMessage();

                NewWorkNumberRespond body = resultMessage.Body as NewWorkNumberRespond;

                txtResult.Text = String.Format(@"您的排队号码为{0},
您前面共有{1}个用户处于等待中!",
                                               body.ResultWorkNumber,
                                               body.QueueLength - 1
                                               );
            }
            catch (Exception ex)
            {
                txtResult.AppendText("连接/发送/接收过程中,发生了错误!");
                txtResult.AppendText(ex.Message);
                txtResult.AppendText(ex.StackTrace);
            }
            finally
            {
                mySocket.Close();
            }
        }