/*
Asynchronous request-reply single-threaded server in Python
that spawns a request handler each time a request is received
This is different from other examples because the number of request handler threads is not defined ahead of time.
Request:
Client DEALER --> Server ROUTER --> Request handler (spawned)
1. Clients send requests via a DEALER socket on port 5570
2. Server receives requests via a ROUTER socket on port 5570
3. Server passes both the request and the client identity directly to request handlers when they are spawned
Reply:
Client DEALER <-- Server ROUTER <-- Server DEALER <-- Request handler DEALER
1. Request handler returns the reply to the Server via a DEALER socket on inproc
2. Server receives the reply from the request handler via a DEALER socket on inproc
3. Server sends the reply to the client via a ROUTER socket on port 5570
4. Client receives the reply via a DEALER socket on port 5570
*/ using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using NetMQ;
using NetMQ.Sockets; namespace NetmqSample
{
public class ZmqClient
{
public void Request(string input)
{
var socket = new DealerSocket();
socket.Options.Identity = Encoding.UTF8.GetBytes(Guid.NewGuid().ToString());
socket.Connect("tcp://127.0.0.1:5570"); socket.SendFrame(input);
Console.WriteLine($"client send: {input} : {DateTime.Now:T}"); var answer = socket.ReceiveFrameString();
Console.WriteLine($"client received: {answer} : {DateTime.Now:T}"); socket.Dispose();
}
} public class ZmqServer
{
private DealerSocket _backend;
private RouterSocket _frontend; public void Run()
{
_frontend = new RouterSocket();
_frontend.Bind("tcp://*:5570");
_frontend.ReceiveReady += Frontend_ReceiveReady; _backend = new DealerSocket();
_backend.Bind("inproc://backend");
_backend.ReceiveReady += Backend_ReceiveReady; var poller = new NetMQPoller { _frontend, _backend };
poller.RunAsync(); Console.WriteLine("server started");
} private void Backend_ReceiveReady(object sender, NetMQSocketEventArgs e)
{
var id = e.Socket.ReceiveFrameString();
var msg = e.Socket.ReceiveFrameString(); Console.WriteLine($"server backend response: {id} : {msg}");
_frontend.SendFrame(id, true);
_frontend.SendFrame(msg);
} private void Frontend_ReceiveReady(object sender, NetMQSocketEventArgs e)
{
var id = e.Socket.ReceiveFrameString();
var msg = e.Socket.ReceiveFrameString(); //Console.WriteLine($"server frontend received: {id} : {msg} : {DateTime.Now:T}");
var task = new Task(() => new RequestHandler().Run(id, msg), TaskCreationOptions.LongRunning);
task.Start();
}
} public class RequestHandler
{
public void Run(string id, string msg)
{
var worker = new DealerSocket("inproc://backend"); // Simulate a long-running operation
Thread.Sleep(); worker.SendFrame(id, true);
worker.SendFrame(msg + " : " + DateTime.Now.ToLongTimeString());
worker.Dispose();
}
}
}
    class Program
{
static void Main(string[] args)
{
var server = new ZmqServer();
server.Run(); Enumerable.Range(, ).ToList().ForEach(x =>
{
Task.Factory.StartNew(() => new ZmqClient().Request(x.ToString("")), TaskCreationOptions.LongRunning);
}); Console.ReadLine();
}
}

zeromq rpc原型的更多相关文章

  1. 简单的RPC原型与实现原理

    存在的问题 客户端硬编码服务端的地址 引入注册中心,方便服务的注册与发现 注册中心记录的信息:服务地址列表&服务节点权重 Zookeeper节点类型 临时节点:客户端.. 服务注销: tomc ...

  2. 使用go reflect实现一套简易的rpc框架

    go jsonrpc 在实际项目中,我们经常会碰到服务之间交互的情况,如何方便的与远端服务进行交互,就是一个需要我们考虑的问题. 通常,我们可以采用restful的编程方式,各个服务提供相应的web接 ...

  3. RPC框架原理简述:从实现一个简易RPCFramework说起(转)

    摘要: 本文阐述了RPC框架与远程调用的产生背景,介绍了RPC的基本概念和使用背景,之后手动实现了简易的RPC框架并佐以实例进行演示,以便让各位看官对RPC有一个感性.清晰和完整的认识,最后讨论了RP ...

  4. linux 下 rpc python 实例之使用XML-RPC进行远程文件共享

    这是个不错的练习,使用python开发P2P程序,或许通过这个我们可以自己搞出来一个P2P下载工具,类似于迅雷.XML-RPC是一个远程过程调用(remote procedure call,RPC)的 ...

  5. 使用XML-RPC进行远程文件共享

    这是个不错的练习,使用python开发P2P程序,或许通过这个我们可以自己搞出来一个P2P下载工具,类似于迅雷.XML-RPC是一个远程过程调用(remote procedure call,RPC)的 ...

  6. Redola.Rpc 的一个小目标

    Redola.Rpc 的一个小目标 Redola.Rpc 的一个小目标:20000 tps. Concurrency level: 8 threads Complete requests: 20000 ...

  7. ZeroMQ:云时代极速消息通信库

    ZeroMQ:云时代极速消息通信库(大规模|可扩展|低成本|高效率解决之道,大规模分布式|多线程应用程序|消息传递架构构建利器) [美]Pieter Hintjens(皮特.亨特金斯)著   卢涛 李 ...

  8. 以ZeroMQ谈消息中间件的设计【译文】

    本文主要是探究学习比较流行的一款消息层是如何设计与实现的 ØMQ是一种消息传递系统,或者乐意的话可以称它为"面向消息的中间件".它在金融服务,游戏开发,嵌入式系统,学术研究和航空航 ...

  9. NetMQ(一):zeromq简介

    ZeroMQ系列 之NetMQ 一:zeromq简介 二:NetMQ 请求响应模式 Request-Reply 三:NetMQ 发布订阅模式 Publisher-Subscriber 四:NetMQ ...

随机推荐

  1. jdk自带的jvm监测程序

    jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. jstat:一个极强 ...

  2. C语言查缺补漏

    7.用ucontext实现简单的用户空间协作多线程 转 http://blog.chinaunix.net/uid-26000137-id-3973004.html http://blog.csdn. ...

  3. jQuery知识点二 实现隔行变色

    <!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...

  4. [从产品角度学excel 04]-单元格的“衣服”

    忘记发这里了..补发一下 这是<从产品角度学EXCEL>系列——单元格篇. 前言请看: 0 为什么要关注EXCEL的本质 1 excel是怎样运作的 2 EXCEL里的树形结构 3 单元格 ...

  5. window server 2008配置FTP服务器550 Access is denied. 问题解决办法

    如果你是按照网上的通用方法,在搭建FTP服务器的时候临时建了一个用户的话,那么这个用户是普通用户,你即便勾选了“读”“写”权限,那么再打开防火墙的情况下,你还是不能上传文件,只能下载.只需要登录到服务 ...

  6. 硬盘安装linux的两条命令

    kernel (hd0,0)/vmlinuz boot=casper iso-scan/filename=/ubuntu-10.04.1-desktop-i386.iso ro quiet splas ...

  7. JavaScript - 正则表达式

    正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功:一旦有匹配不成功的字符则匹配失败. 正则表达式通常用于在文本中查找匹配的字符串.Python里数量词默 ...

  8. Beta阶段项目总结

    1.   每个成员在beta 阶段的实践和alpha 阶段有何改进? 王文奇:对数据库的操作更为熟练,在java web中实现对数据库的修改更加完善 刘元柱:对javascript,css和servl ...

  9. Visual Studio 版本转换工具WPF版开源了

    想法的由来 入职一家新公司,领导给了个任务,要编写一个视频监控软件,等我编写调试好,领导满意了以后,这个软件要加入到公司的一个软件系统中去(这个添加工作不用我来做,嘻嘻,看着自己的软件被别人使用,心情 ...

  10. phalcon3.0.1默认多模块生成的几个bug

    发现用Phalcon DevTools (3.0.0)生成的多模块有一些bug: 默认的路由定义,字符串替换有误 原代码// $namespace = str_replace('Module','Co ...