现实中的socket可能会因为各种原因done机,但这么重要的服务器怎么能允许这种事情发生?这次我们就来通过一个线程去监控socket服务器,如果done机重新将其启动。

下面是监控项目和socket服务器项目的目录结构:

因为线程是每两秒发送一次请求检测服务器是否done机,类似心跳,所以包名起作heart。

来看客户端heart代码:

Entity 实体类:用来构建测试请求的数据结构

package heart;import java.io.Serializable;public class Entity implements Serializable {private static final long serialVersionUID = 1L;private String name;private String sex;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "Entity [name=" + name + ", sex=" + sex + "]";}}

客户端同步线程代码:

package heart;public class ClientHeart extends Thread {@Overridepublic void run() {try {while (true) {ClientSender.getInstance().send();synchronized (ClientHeart.class) {// this.wait(5000);Thread.sleep(2000);}}} catch (Exception e) {e.printStackTrace();}}/*** 程序的入口main方法* * @param args*/public static void main(String[] args) {ClientHeart client = new ClientHeart();client.start();}}

客户端发送消息代码:

package heart;import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;import echoserver.EchoServer;
import heart.Entity;public class ClientSender {private ClientSender() {}Socket sender = null;private static ClientSender instance;public static ClientSender getInstance() {if (instance == null) {synchronized (ClientHeart.class) {instance = new ClientSender();}}return instance;}@SuppressWarnings("static-access")public void send() {try {sender = new Socket("192.168.1.166", 9090);while (true) {ObjectOutputStream out = new ObjectOutputStream(sender.getOutputStream());Entity obj = new Entity();obj.setName("xiaoming");obj.setSex("男");out.writeObject(obj);out.flush();System.out.println("已发送...");Thread.sleep(5000);}} catch (Exception e) {EchoServer myServer = new EchoServer();System.out.println("连接异常");try {myServer.main(null);} catch (Exception e1) {// TODO Auto-generated catch block
                e1.printStackTrace();}}}
}

发送消息代码中,可以看到socket是重新起的一个socket,和socket服务器并无关联,与服务器中的heart代码中的服务器相对应(如果加上监控socket的服务器,服务器项目中其实是有两个服务器的,一个作为socket服务器,一个作为监控socket的服务器),这样就可以避免一直重新new出socket造成的channel异常。

一开始我选择用过quartz定时器作为轮巡监测,也试着搭建过webservice,但是都失败了。quartz轮巡会造成socket服务器的阻塞,webservice的话,如果服务器done机,那么这个webservice也就跟着一起done掉了,更不要谈什么监测了,所以,创建一个单线程的监测,速度又快(2秒一次完全够了),又安全,何乐不为?

注意,客户端的config包中的xml配置文件其实是和服务器中的一模一样的,我是在监测服务器的项目中为了能够在服务器done机后重新启动服务器,在buildPath中加入了服务器的项目,但是服务器项目中需要引用EchoServer.xml这个文件,所以在客户端重新复制了一份。

以下是服务器端的监测线程:

package heart;import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import heart.Entity;public class ServerHeart extends Thread {private ServerSocket server = null;Object obj = new Object();@Overridepublic void run() {try {server = new ServerSocket(9090);while (true) {Socket client = server.accept();synchronized (obj) {new Thread(new Client(client)).start();}}} catch (Exception e) {e.printStackTrace();}}/*** 客户端线程* * @author USER**/class Client implements Runnable {Socket client;public Client(Socket client) {this.client = client;}@Overridepublic void run() {try {while (true) {ObjectInput in = new ObjectInputStream(client.getInputStream());Entity entity = (Entity) in.readObject();System.out.println(entity);}} catch (Exception e) {e.printStackTrace();}}}/*** 程序的入口main方法* * @param args*/public static void main(String[] args) {System.out.println("开始检测服务器是否done机...");new ServerHeart().start();}
}

下面附上两个项目的传送门:http://files.cnblogs.com/files/fengwenzhee/monitorSocket.rar

另外:SSsocket(服务器项目)中有一个Test.jar文件,这个可不是jar包,里面是socket服务器的测试原件,直接解压就可以用了。

如果要在linux系统测试,就把两个项目打成可执行的jar(runnable JAR file),然后导入linux虚拟机中(我是通过putty这个辅助软件导入的)地址:http://files.cnblogs.com/files/fengwenzhee/putty.rar,命令在我另一篇博客中有提到,然后jar -jar monitor.jar命令启动项目,(我是直接启动的监控项目,正好测试一下是否成功拉起done机的socket服务器)。

测试成功,至于服务器的socket我用的是quicksocket,关于服务器有什么不明白的可以直接留言。

转载请注明出处。

转载于:https://www.cnblogs.com/fengwenzhee/p/7119546.html

通过线程监控socket服务器是否done机相关推荐

  1. socket通信时如何判断当前连接是否断开--select函数,心跳线程,QsocketNotifier监控socket...

    client与server建立socket连接之后,如果突然关闭server,此时,如果不在客户端close(socket_fd),会有不好的影响: QsocketNotifier监控socket的槽 ...

  2. php 连接socket服务器_PHP-Socket服务端客户端发送接收通信实例详解

    Socket介绍 什么是socket 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求 ...

  3. php后端如何搭建socket服务,从php做一个简单的socket服务器流程

    socket的中文名字称为套接字,这类物品就是说对TCP/iP的"封裝".实际中的互联网事实上只能四层罢了,从上至下分別是网络层.传输层.网络层.统计数据链路层.最常见的.com协 ...

  4. 智能家居项目开发: 设计模式(工厂模式)+ 线程池 + Socket (持续更新中)

    智能家居项目开发 一.智能家居功能细节拆分 控制区: 外设区: 面向对象类和对象的概念 结构体新玩法 二.工厂模式 1. 工厂模式的概念 2. 工厂模式的实现 3. 工厂模式使用及功能验证 三.智能家 ...

  5. Java实现远程服务器监控,【Java】监控远程服务器JVM

    今天在用JMeter进行测试的时候,发现线程并发量到50的时候会导致阻塞情况,于是需要监控远程JVM,那么如何监控远程JVM呢? 首先,找到启动计量引擎的sh文件,例如我目前的计量引擎启停文件为str ...

  6. 如何用Java编写一个简单的服务器和客户机

    今天我要向大家介绍的是自己编写的一个比较简单的服务器和客户机程序,注意一下哦,比较简单.好了,闲话休提,砸门直入主题. 小编先从客户机和服务器的模型开始讲解.简单来说,我们实现的这种模型呢,我们每一个 ...

  7. [转|整理]翻译:使用.net3.5的缓存池和SocketAsyncEventArgs类创建socket服务器

    原文地址:http://www.cnblogs.com/onlytiancai/archive/2008/06/25/1229321.html http://www.cnblogs.com/killk ...

  8. C# socket编程实践——支持广播的简单socket服务器

    在上篇博客简单理解socket写完之后我就希望写出一个websocket的服务器了,但是一路困难重重,还是从基础开始吧,先搞定C# socket编程基本知识,写一个支持广播的简单server/clie ...

  9. Nagios监控linux服务器

    原始出处 Nagios监控linux服务器 平台及所用组件,     监控服务器:RHEL5(192.168.0.20)+nagios-3.0.5+ nagios-plugins-1.4.11+ nr ...

最新文章

  1. 地理围栏API服务开发
  2. Intel和IBM押重注的神经模态计算,会给行业带来什么样的变化
  3. vs2005无法断点调试网站,断点失效
  4. Linux压缩命令总结
  5. wxpython使用folium_wxPython实现文本框基础组件
  6. Java中的String类
  7. 【经典回放】多种语言系列数据结构算法:队列(C版)
  8. 2017西安交大ACM小学期数据结构 [树状数组,极大值]
  9. 点击时候确定某个元素 js_某空气质量监测平台 JS反爬
  10. Codeforces 853C - Boredom
  11. [PHP]图片上传代码【原创】
  12. 最新emoji表情代码大全_10月最新早上好问候语表情图片大全,朋友们大家早上好表情包!...
  13. tomcat自定义错误页面
  14. 如何使用 RootFS 功能删除 Odyssey 越狱
  15. You're currently running Fcitx with GUI 错误解决 Fcitx
  16. hspice linux 软件,Hspice 200803 linux安装(亲测可行)
  17. Ps 原来排版证件照如此简单(╹ڡ╹ )
  18. RT9193稳压芯片的电路原理图
  19. 通过电脑远程链接termux
  20. 组合导航原理剖析(四):惯性和GNSS器件选型与误差来源

热门文章

  1. UVA116 单向 DSP(多段图最短路)
  2. POJ 3254 poj3254 Corn Fields
  3. Uploadify jsp使用示例
  4. 计算机网络---网络层ARP协议
  5. 【 Element UI 】—Element UI 的基本使用
  6. Vue项目中关闭Eslint
  7. Error:Trailing spaces not allowed no-trailing-spaces
  8. JavaScript学习(九十一)—二维数组的基本操作
  9. SpringBoot常用注解以及作用
  10. 力扣 有多少小于当前数字的数字