现实中的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;
} @Override
public String toString() {
return "Entity [name=" + name + ", sex=" + sex + "]";
} }

客户端同步线程代码:

package heart;

public class ClientHeart extends Thread {

    @Override
public 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(); @Override
public 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;
} @Override
public 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,关于服务器有什么不明白的可以直接留言。

转载请注明出处。

通过线程监控socket服务器是否done机的更多相关文章

  1. 通过监控线程状态来保证socket服务器的稳定运行

    云平台中使用的socket服务器是我们自己定义一套通信协议,并通过C#实现的一个socket服务. 该服务目前是和web服务一起运行在IIS容器中,通过启动一个永不退出的新线程来监听端口. 在开发的初 ...

  2. (原创)使用C#开发高性能PLC上位机监控系统服务器应用程序

    PLC服务器监控系统的特点: 1·使用微软C#面向对象开发语言开发应用程序.2·使用了健壮性与性能良好的SUPER SOCKET服务器通信框架,实现自定义应用层通信协议,支持多台PC客户端访问服务器, ...

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

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

  4. 【RL-TCPnet网络教程】第19章 RL-TCPnet之BSD Socket服务器

    第19章      RL-TCPnet之BSD Socket服务器 本章节为大家讲解RL-TCPnet的BSD Socket,学习本章节前,务必要优先学习第18章的Socket基础知识.有了这些基础知 ...

  5. java的nio之:java的bio流下实现的socket服务器同步阻塞模型和socket的伪异步的socket服务器的通信模型

    同步I/O模型的弊端===>每一个线程的创建都会消耗服务端内存,当大量请求进来,会耗尽内存,导致服务宕机 伪异步I/O的弊端分析===>当对Socket的输入流进行读取操作的时候,它会一直 ...

  6. 再次回首 TCP Socket服务器编程

    转载:http://www.cnblogs.com/zc22/archive/2010/06/27/1766007.html ------------------ 前言 --------------- ...

  7. 利用NIO建立Socket服务器

    传统的Java 的IO,利用Socket建立服务器,接收客户端连接,一般都是为每一个连接建立一个线程,如果连接数巨大,那么服务器开销也将巨大..NIO的原理,可以参照图:http://new.51ct ...

  8. 经过一年时间的沉淀 再次回首 TCP Socket服务器编程--转

    ------------------ 前言 ------------------ 开发了这么多年,发现最困难的程序开发就是通讯系统. 其他大部分系统,例如CRM/CMS/权限框架/MIS之类的,无论怎 ...

  9. c#Socket服务器与客户端的开发(1)

    上个项目中用到了Socket通讯,项目中直接借助SuperSocket实现,但是我觉得这毕竟是一个我没接触过的东西,所以也顺便学习了一下原生socket的使用,做了一个socket服务器与客户端的开发 ...

随机推荐

  1. Python LED

    led.py from gpiozero import LED from time import sleep led = LED(17) while True: print "start c ...

  2. STM32的RFID射频读写控制装置

    ,大二上学期做的,过了很久,先上一下图: 这并不是做个最后一版:主体是RC552+STM32+1062:蜂鸣器,继电器,LED等:反正最后的效果就是,刷一下卡,1602显示一下持卡人(需要提前注册,注 ...

  3. 使用PostProcessBuild设定Unity产生的Xcode Project

    简单来说就是unity提供一套api去修改xcode项目工程配置以及修改plist文件内容(当unity build结束后, 会自动回调OnPostProcessBuild). 以下是一些用到的配置处 ...

  4. Tomcat 安装与配置

    1. 将压缩文件“apache-tomcat-7.0.62.zip ”上传到linux系统目录:/home/下 2. 进入目录 cd /home/ 解压文件,执行如下命令:unzip apache-t ...

  5. js继承之借用构造函数继承

    我的上一篇文章介绍了,原型链继承模式.但是单纯的原型链模式并不能很好地实现继承. 一.原型链的缺点 1.1 单纯的原型链继承最大的一个缺点,来自于原型中包含引用类型的值. 本来,我们没有通过原型链实现 ...

  6. 【源码解析】BlockManager详解

    1 Block管理模块的组件和功能 BlockManager:BlockManager源码解析 Driver和Executor都会创建 Block的put.get和remove等操作的实际执行者 Bl ...

  7. Linux常用命令-jdk和Tomcat

    一.JDK的安装和配置 1.下载jdk文件 去官方网站下载Linux 64位  jdk-8u131-linux-x64.tar.gz 2.使用Ftp工具上传到/usr/local 下. 使用命令:ta ...

  8. spring annotation功能备注

      @Autowired @Autowired 注释可以在 setter 方法中被用于自动连接 bean.以type方式进行匹配. 一个构造函数 @Autowired 说明当创建 bean 时,即使在 ...

  9. 你知道现在有一种新的OCR技术叫“移动端车牌识别”吗?

    核心内容:车牌识别.OCR识别技术.移动端车牌识别.手机端车牌识别.安卓车牌识别.Android车牌识别.iOS车牌识别 一.移动端车牌识别OCR技术研发原理 移动端车牌识别是基于OCR识别的一种应用 ...

  10. Vue.js高仿饿了么WebApp

    介绍 学习Vue.js也有一阵子了,为了加深对Vue的理解及运用,做了一个小项目.这是一个高仿饿了么外卖WebApp,现已完成商品预览.商品详情.商家预览.添加购物.查看评论等功能. 部分截图 项目预 ...