基本上ZeroMQ(java)中基本的代码都算是过了一遍了吧,不过觉得它在日志这一块貌似基本没有做什么工作,也就是我们通过日志来知道ZeroMQ都发生了什么事情。。

而且由于ZeroMQ中将连接的建立和重连接都进行了隔离,用户不需要做什么事情来维护连接,当然这样做的好处是使程序员的编码工作变少了,但是当然也有不好的地方,那就是用户失去了对ZeroMQ整个运行阶段的控制。。

例如,当我们主动去连接一个远程地址,或者连接中断之后,没有日志告诉我们都这些事情发生了。。。当时对于一个消息通信系统来说,这些日志,或者说事件的监控都是至关重要的。

当然没有日志来记录这些内容,并不代表我们就无法知道当前运行情况都发生了什么事情,ZeroMQ中采用了另外一种方法来监控Socket的情况,不过这种方法比较恶心,需要建立额外的Socket来监控自己感兴趣的Socket。。。

这里先不说这些闲话了,来看看ZeroMQ中都定义了哪些监听事件:public static final int EVENT_CONNECTED = zmq.ZMQ.ZMQ_EVENT_CONNECTED; //当主动建立连接建立成功之后的事件

public static final int EVENT_DELAYED = zmq.ZMQ.ZMQ_EVENT_CONNECT_DELAYED; //连接延迟

public static final int EVENT_RETRIED = zmq.ZMQ.ZMQ_EVENT_CONNECT_RETRIED; //尝试重新连接

public static final int EVENT_CONNECT_FAILED = zmq.ZMQ.ZMQ_EVENT_CONNECT_FAILED; //连接失败

public static final int EVENT_LISTENING = zmq.ZMQ.ZMQ_EVENT_LISTENING; //建立了监听

public static final int EVENT_BIND_FAILED = zmq.ZMQ.ZMQ_EVENT_BIND_FAILED; //bind失败

public static final int EVENT_ACCEPTED = zmq.ZMQ.ZMQ_EVENT_ACCEPTED; //接收到accept事件

public static final int EVENT_ACCEPT_FAILED = zmq.ZMQ.ZMQ_EVENT_ACCEPT_FAILED; //accept出错的事件

public static final int EVENT_CLOSED = zmq.ZMQ.ZMQ_EVENT_CLOSED; //关闭事件

public static final int EVENT_CLOSE_FAILED = zmq.ZMQ.ZMQ_EVENT_CLOSE_FAILED; //关闭失败

public static final int EVENT_DISCONNECTED = zmq.ZMQ.ZMQ_EVENT_DISCONNECTED; //连接断开

public static final int EVENT_ALL = zmq.ZMQ.ZMQ_EVENT_ALL; //所有的事件

上面是定义的所有可能发生的事件,具体每一种事件代表什么意思后面的注释都已经说明了,当然这里面我觉得最重要的事件有连接的断开,连接的建立,以及重连接等事件。。。

接下来我们来看看如何在ZeroMQ(java)中来监控这些事件吧,直接上代码了:import org.zeromq.ZMQ;

import zmq.ZMQ.Event;

public class Request {

public static void main (String args[]) {

ZMQ.Context context = ZMQ.context(1);

ZMQ.Socket req = context.socket(ZMQ.REQ);

req.monitor("inproc://reqmoniter", ZMQ.EVENT_CONNECTED | ZMQ.EVENT_DISCONNECTED); //这段代码会创建一个pair类型的socket,专门来接收当前socket发生的事件

final ZMQ.Socket moniter = context.socket(ZMQ.PAIR); //这里创建一个pair类型的socket,用于与上面建立的moniter建立连接

moniter.connect("inproc://reqmoniter"); //连接当前socket的监听

new Thread(new Runnable(){

public void run() {

// TODO Auto-generated method stub

while (true) {

Event event = Event.read(moniter.base()); //从当前moniter里面读取event

System.out.println(event.event + " " + event.addr);

}

}

}).start();

req.connect("tcp://127.0.0.1:5000");

while (true) {

req.send("aaa");

req.recv();

}

}

}

package monit;

import org.zeromq.ZMQ;

public class Response {

public static void main(String args[]) {

final ZMQ.Context context = ZMQ.context(1);

ZMQ.Socket response = context.socket(ZMQ.REP);

response.bind("tcp://*:5000");

while (!Thread.currentThread().isInterrupted()) {

response.recv();

response.send("hello".getBytes());

try {

Thread.currentThread().sleep(100);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

response.close();

context.term();

}

}

这里代码用req/rep来举例子的,其实用起来还算是比较的简单,当连接建立之后,将会输出:

1  tcp://127.0.0.1:5000

1就是代表连接建立的事件,后面是建立连接的地址,

这个时候如果关闭response,那么将会输出如下:

512  tcp://127.0.0.1:5000

512代表的就是连接断开的事件。。。

嗯,至于说监控的源码是怎么实现的,这里就不细说了,其实还是非常的简单的,如果有兴趣可以自己去看看。。

到此ZeroMQ(java)的代码就算是读的差不多了,算是告一段落吧,接下来好好看看书。。。另外有想 再搞搞C/C++方面的东西。。。初步计划看看Redis的源码吧。。。。

作者:fjs_cloud 发表于2014-1-3 15:31:43 原文链接

阅读:74 评论:0 查看评论

java socket监控_ZeroMQ(java)中监控Socket相关推荐

  1. c++ socket编程_C/C++中的Socket编程

    什么是socket编程? Socket编程是将网络上的两个节点连接起来相互通信的一种方式.一个套接字(节点)侦听IP上的特定端口,而另一个套接字与另一个套接字连接.服务器形成侦听器套接字,而客户端可以 ...

  2. java socket http请求_JAVA中利用socket实现HTTP请求

    一个基于java的web服务器实现主要使用这两个重要的类:java.net.Socket和java.net.ServerSocket,并通过HTTP消息进行通信. HTTP请求 一个HTTP请求包括三 ...

  3. C语言Socket之iOS项目中的socket应用/IPV6 转换/域名转IP/解析socket接受的数据/心跳包

    使用系统API合成IPv6: 如果你的APP需要连接的服务器 只有IPv4地址,没有域名,可以用 getaddrinfo 来解决.下面的代码,将IPv4地址(如:192.0.2.1) 地址转换为IPv ...

  4. Android中基于Socket的网络通信

    1. Socket介绍 2. ServerSocket的建立与使用 3. 使用ServerSocket建立聊天服务器-1 4. 使用ServerSocket建立聊天服务器-2 5. 在Android中 ...

  5. 1、Linux中的socket与TCP通信

    socket介绍 1.所谓 socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象. 2.一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制. ...

  6. java tcp read_【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)...

    书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子--反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: 书上的服务器 ...

  7. 在Java中使用Socket模拟客户端和服务端(多线程)

    1:Socket与ServerSocket的交互 2.Socket和ServerSocket介绍 Socket 构造函数 Socket() Socket(InetAddress address, in ...

  8. Java中利用socket实现简单的服务端与客户端的通信(中级)——实现任意双向通信

    本文计划采用socket实现客户端和服务端的任意双向通信,即客户端可以随时给服务端发消息,服务端也可以随时给客户端发消息,最终结果就是一个类似与QQ的聊天软件的功能. 以下代码可以直接拷贝到Eclip ...

  9. Java中利用socket实现简单的服务端与客户端的通信(基础级)

    在上一篇文章中,简单的介绍了java中入门级的socket编程,简单的实现了客户端像服务器端发送数据,服务器端将数据接收并显示在控制台,没有涉及多线程.上一篇文章的链接:Java中利用socket实现 ...

最新文章

  1. 国信优易首席科学家周涛:大数据的商业应用
  2. 编程中python怎么读-python之文件读写
  3. 微型计算机的层次结构,计算机系统层次结构微程序级
  4. 互联网的大数据神话——NoSQL
  5. SAP Engagement Center的ShellCarousel控件control
  6. redshift教程_分析和可视化Amazon Redshift数据—教程
  7. Linux使用笔记: 设置Samba服务器中新建文件/目录的权限
  8. 多帧点云数据拼接合并_PCL点云处理实践(二):点云的处理和拼接
  9. JQuery $.each遍历JSON字符串报Uncaught TypeError:Cannot use 'in' operator to search for
  10. Redis五种数据类型及应用场景
  11. nodejs安装服务器系统,window下,nodejs安装http-server,并开启HTTP服务器
  12. POJ 3580 SuperMemo 伸展树
  13. 引用 一个较优雅的GridView隐藏列取值解决方案
  14. Vijos1906 联合权值 NOIP2014Day1T2 树形动态规划
  15. ArcSDE NetWork I/O Error 错误处理(待完善)
  16. Mysql 驱动包mysql-connector-java-8.0.25.jar下载
  17. python源代码(create,huafen,doc)
  18. 手把手教你绘制最基础的列线图
  19. protel中单位换算!mil=?mm!走线的粗细
  20. 服务器显示阵列卡升级,Systemx服务器在BIOS中刷新阵列卡微码

热门文章

  1. ggplot2版聚类物种丰度堆叠图
  2. Microbiome:宏基因组分箱流程MetaWRAP安装和数据库布置
  3. USEARCH11发布,新功能简介
  4. R语言使用timeROC包计算无竞争情况下的生存资料多个标记物在相同时间下的cox及协变量分析AUC值、并可视化多个标记物在相同时间下的ROC值、多指标的ROC曲线
  5. pandas将dataframe原有的数据列名称转化为整数数值列名称(convert dataframe column labelsl into integers)
  6. 什么是信度分析(Reliability)?有哪些信度分析方法?那什么又是效度?
  7. R构建二次回归模型( Quadratic Regression)
  8. python使用正则表达式判别用户输入密码的强弱并提示
  9. pandas pivot_table透视表、crosstab交叉表、aggfunc函数详解及实战
  10. ajax dojo deferred,dojo(四):ajax请求