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); }
/// <summary> /// 消息处理. /// </summary> /// <param name="message"></param> /// <returns></returns> public QueuingMachineMessage DoMessageProcess(QueuingMachineMessage message) { QueuingMachineMessage result = new QueuingMachineMessage() { Header = new MessageHeader() { CommandID = message.Header.CommandID + 0x80000000, SequenceNo = message.Header.SequenceNo, }, }; switch (message.Header.CommandID) { case MessageHeader.QM_NewWorkNumber_Req: // 申请新号码. result.Body = GetNewWorkNumberRespond(message.Body as NewWorkNumberRequest); break; case MessageHeader.QM_AskWorkNumber_Req: // 需要一个号码. result.Body = GetAskWorkNumberRespond(message.Body as AskWorkNumberRequest); break; } // 返回. return(result); }
/// <summary> /// 接受消息. /// </summary> /// <returns></returns> public QueuingMachineMessage ReceiveMessage() { BinaryReader reader = new BinaryReader(stream); QueuingMachineMessage result = new QueuingMachineMessage(); queuingMachineMessageCoding.Decode(reader, result); return(result); }
/// <summary> /// 发送消息. /// </summary> /// <param name="message"></param> public void SendMessage(QueuingMachineMessage message) { // 消息转换为 byte 数组. BinaryWriter writer = new BinaryWriter(stream); queuingMachineMessageCoding.Encode(writer, message); // 通过 Socket 发送. Socket.Send(stream.GetBuffer(), message.Header.CommandLength, SocketFlags.None); }
public void TestFixtureSetUp() { message = new QueuingMachineMessage() { Header = new MessageHeader() { CommandID = MessageHeader.QM_CloseWorkNumber_Resp, SequenceNo = 1, }, Body = new CloseWorkNumberRespond(), }; }
/// <summary> /// 接受消息. /// </summary> /// <returns></returns> public QueuingMachineMessage ReceiveMessage() { byte[] bytes = new byte[256]; Socket.Receive(bytes); stream = new MemoryStream(bytes); BinaryReader reader = new BinaryReader(stream); QueuingMachineMessage result = new QueuingMachineMessage(); queuingMachineMessageCoding.Decode(reader, result); return(result); }
public void TestFixtureSetUp() { message = new QueuingMachineMessage() { Header = new MessageHeader() { CommandID = MessageHeader.QM_NewWorkNumber_Req, SequenceNo = 1, }, Body = new NewWorkNumberRequest() { ServiceCode = "A", }, }; }
public void TestFixtureSetUp() { message = new QueuingMachineMessage() { Header = new MessageHeader() { CommandID = MessageHeader.QM_AskWorkNumber_Resp, SequenceNo = 1, }, Body = new AskWorkNumberRespond() { ResultStatus = 1, ResultWorkNumber = "00100", }, }; }
public void TestFixtureSetUp() { message = new QueuingMachineMessage() { Header = new MessageHeader() { CommandID = MessageHeader.QM_NewWorkNumber_Resp, SequenceNo = 1, }, Body = new NewWorkNumberRespond() { ResultWorkNumber = "A0009", TopWorkNumber = "A0005", QueueLength = 4, }, }; }
public void SendRecvTest() { if (message == null) { // 当没有消息的情况下,不处理。 return; } // 消息发送. MemoryMessageSender sender = new MemoryMessageSender(); // 发送消息. sender.SendMessage(message); // 取得字节数组. byte[] data = sender.MessageData; // 字节数组应该非空. Assert.IsNotNull(data); // 字节数组长度大于0. Assert.IsTrue(data.Length > 0); // 消息接收. MemoryMessageReceiver receiver = new MemoryMessageReceiver(); // 接收消息. receiver.MessageData = data; QueuingMachineMessage resultMessage = receiver.ReceiveMessage(); // 结果消息非空. Assert.IsNotNull(resultMessage); // 发送的消息, 与接收的消息, 应该一致. Assert.AreEqual(message, resultMessage); }
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); } }
/// <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="message"></param> public void SendMessage(QueuingMachineMessage message) { BinaryWriter writer = new BinaryWriter(stream); queuingMachineMessageCoding.Encode(writer, message); }
/// <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(); } }