/// <summary> /// 启动发布服务器 /// </summary> public void StartPubServer() { Task task = new Task(() => { // 创建发布服务的Socket using (var server = new ZeroMQ.ZSocket(ZeroMQ.ZSocketType.PUB)) { server.Bind("tcp://127.0.0.1:1001"); while (true) { if (isClosing) { using (var quit = new ZeroMQ.ZFrame("Quit")) { server.SendFrame(quit); } break; } using (var head = new ZeroMQ.ZFrame("Time")) { server.SendFrameMore(head); } using (var body = new ZeroMQ.ZFrame(DateTime.Now.TimeOfDay.ToString())) { server.SendFrame(body); } Thread.Sleep(2000); } Console.WriteLine("PubServer is Closed."); } }); task.Start(); }
/// <summary> /// 启动路由服务器 /// </summary> public void StartRouterServer() { var front = new ZeroMQ.ZSocket(ZeroMQ.ZSocketType.ROUTER); var backend = new ZeroMQ.ZSocket(ZeroMQ.ZSocketType.ROUTER); Task taskFront = new Task(() => { int i = 0; front.Bind("tcp://127.0.0.1:1003"); while (true) { if (isClosing) { break; } using (var msg = front.ReceiveMessage()) { var id = msg[0].ReadString(); Console.WriteLine("Received From Client:{0}", id); var content = "Do Work->" + msg[1].ReadString(); var replyMsg = "No Worker"; if (workerList.Count > 0) { if (i > workerList.Count - 1)// 负载均衡工人 { i = 0; } using (var head = new ZeroMQ.ZFrame(workerList[i])) { backend.SendFrameMore(head); } using (var body = new ZeroMQ.ZFrame(content)) { backend.SendFrame(body); } replyMsg = "Beging Working..."; i++; } using (var reply = new ZeroMQ.ZFrame(replyMsg)) { front.SendFrame(reply); } } } front.Close(); Console.WriteLine("FrontServer is Closed."); }); Task taskBacend = new Task(() => { backend.Bind("tcp://127.0.0.1:1004"); while (true) { if (isClosing) { break; } // 接收工人上线消息 using (var msg = backend.ReceiveMessage()) { var worker = msg[0].ReadString(); var info = msg[1].ReadString(); if (info == "Quit") { workerList.Remove(worker); } if (!workerList.Contains(worker)) { workerList.Add(worker); } Console.WriteLine("{0} is standby, Msg:{1}", worker, info); } } backend.Close(); Console.WriteLine("BackendServer is Closed."); }); taskFront.Start(); taskBacend.Start(); }