Пример #1
0
        private void PorcessOneRequest(Socket mySocket)
        {
            ShowProcessMessage("接收到客户的连接...");

            // 消息接收器.
            SocketMessageReceiver receiver = new SocketMessageReceiver();
            receiver.Socket = mySocket;

            // 接收消息.
            QueuingMachineMessage message = receiver.ReceiveMessage();
            // 输出消息.
            ShowProcessMessage("接收->" + message.ToString());

            // 处理消息.
            QueuingMachineMessage resultMessage = processer.DoMessageProcess(message);
            // 输出消息.
            ShowProcessMessage("反馈->" + resultMessage.ToString());

            SocketMessageSender sender = new SocketMessageSender();
            sender.Socket = mySocket;
            sender.SendMessage(resultMessage);
        }
Пример #2
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();
            }
        }
        /// <summary>
        /// 发送请求消息.
        /// </summary>
        /// <param name="code"></param>
        private int SendMessage()
        {
            QueuingMachineMessage message = new QueuingMachineMessage()
            {
                Header = new MessageHeader()
                {
                    CommandID = MessageHeader.QM_AskWorkNumber_Req,
                    SequenceNo = sequenceNo++,
                },
                Body = new AskWorkNumberRequest()
                {
                    ServiceCode = ServiceCode,
                },
            };

            // 第一个参数: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();

                AskWorkNumberRespond body = resultMessage.Body as AskWorkNumberRespond;

                if (body.ResultStatus == 0)
                {
                    ShowProcessMessage(String.Empty, "休息中......");

                    this.maxWorkingTimes = 0;
                    this.workingTimes = 0;
                }
                else
                {
                    ShowProcessMessage(body.ResultWorkNumber, "服务中......");

                    // 随机服务时间.
                    this.maxWorkingTimes = random.Next(5, 15);
                    this.workingTimes = 0;

                }

                return body.ResultStatus;
            }
            catch (Exception ex)
            {
                ShowProcessMessage(String.Empty,  "连接/发送/接收过程中,发生了错误!" + ex.Message );

                return 0;
            }
            finally
            {
                mySocket.Close();
            }
        }