服务器端口监测系统
? ?前提說明:在日常的項(xiàng)目中,由于數(shù)據(jù)量大,數(shù)據(jù)庫隔幾天就會(huì)自動(dòng)宕機(jī),獨(dú)自運(yùn)行的程序也會(huì)自行宕機(jī),或者網(wǎng)絡(luò)不穩(wěn)當(dāng)。產(chǎn)生的各種各樣的問題,有時(shí)候沒有及時(shí)發(fā)現(xiàn)會(huì)導(dǎo)致問題變得越來越大。于是寫了一個(gè)監(jiān)控系統(tǒng),每隔1分鐘對(duì)程序進(jìn)行監(jiān)測(cè),如有離線狀態(tài)的消息,每隔5分鐘會(huì)發(fā)送郵件,方便正常維護(hù)處置。
源代碼:碼云
1.Demo?
2.建表
總共建兩張表即可
CREATE TABLE `socket` (`id` varchar(255) NOT NULL,`mc` varchar(255) DEFAULT NULL,`ip` varchar(255) DEFAULT NULL,`prot` varchar(255) DEFAULT NULL,`status` varchar(255) DEFAULT NULL,`time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`ifsocket` int(11) DEFAULT NULL,`ifdelte` int(11) DEFAULT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `email` (`id` int(11) NOT NULL AUTO_INCREMENT,`email` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;3.后端代碼
? 3.1 實(shí)體類
import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.experimental.Accessors;import java.util.Date; @Data @Accessors(chain = true) public class Socket {private String id;private String mc;private String ip;private String prot;private String status;@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")private Date time;private int ifsocket;private int ifdelte;public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getMc() {return mc;}public void setMc(String mc) {this.mc = mc;}public String getIp() {return ip;}public void setIp(String ip) {this.ip = ip;}public String getProt() {return prot;}public void setProt(String prot) {this.prot = prot;}public Date getTime() {return time;}public void setTime(Date time) {this.time = time;}public int getIfsocket() {return ifsocket;}public void setIfsocket(int ifsocket) {this.ifsocket = ifsocket;}public int getIfdelte() {return ifdelte;}public void setIfdelte(int ifdelte) {this.ifdelte = ifdelte;} }? 3.2? xml
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.sws.course.dao.SocketDao"><!--查詢所有要監(jiān)聽的ip和端口號(hào)--><select id="findAll" resultType="com.sws.course.dto.Socket"> -- SELECT * FROM `socket` where ifdelte=1 and ifsocket=1;SELECT * FROM `socket` where ifdelte=1 ;</select><!--插入要監(jiān)聽的ip和端口號(hào)--><insert id="insertSocket" parameterType="com.sws.course.dto.Socket">insert into socket (id,mc,ip,prot,status,ifsocket,ifdelte) values(#{id},#{mc},#{ip},#{prot},#{status},#{ifsocket},#{ifdelte})</insert><!--插入要監(jiān)聽的ip和端口號(hào)--><update id="updateSocket" parameterType="com.sws.course.dto.Socket">update socket SET status=#{status},time=#{time} where id=#{id} ;</update><!--查詢表中是離線的服務(wù)--><select id="findbyStatus" resultType="com.sws.course.dto.Socket">SELECT mc,ip,prot FROM `socket` where status='離線'</select><!--查詢要發(fā)送的郵箱--><select id="findEmail" resultType="String">SELECT email from email</select><!--刪除數(shù)據(jù)--><delete id="deleteById">delete FROM `socket` where id=#{id}</delete> </mapper>? 3.3? Dao
import com.sws.course.dto.Socket; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.Date; import java.util.List;@Mapper public interface SocketDao {//查詢所有需要監(jiān)控的ip端口List<Socket> findAll();//插入所有需要監(jiān)控的ip端口int insertSocket(@Param("id") String id,@Param("mc") String mc,@Param("ip") String ip,@Param("prot") String prot,@Param("status") String status,@Param("ifsocket") int ifsocket,@Param("ifdelte") int ifdelte);//修改服務(wù)端口的狀態(tài)int updateSocket(@Param("id") String id,@Param("mc") String mc,@Param("ip") String ip,@Param("prot") String prot,@Param("status") String status,@Param("time") Date time);//查詢表中是離線的服務(wù)List<Socket> findbyStatus();//查詢要發(fā)送的郵箱List<String> findEmail();//根據(jù)id刪除相關(guān)數(shù)據(jù)int deleteById(String id);}3.4Controller
package com.sws.course.controller;import com.fasterxml.jackson.annotation.JsonFormat; import com.sws.course.dao.SocketDao; import com.sws.course.dto.Socket; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*;import java.util.*;@RestController @RequestMapping("/Socket") @CrossOrigin @Slf4j public class SocketController {@Autowiredprivate SocketDao dao;@PostMapping("add")public Map<String,Object> add(String mc,String ip,String prot) {UUID uuid= UUID.randomUUID();String uuidString=uuid.toString();dao.insertSocket(uuidString,mc,ip,prot,"待定",1,1);Map<String, Object> map = new HashMap<>();map.put("success","保存成功");map.put("ip",ip);map.put("prot",prot);return map;}@PostMapping("findAll")public List<Socket> findAll() {List<Socket> list=dao.findAll();return list;}@PostMapping("deleteById")public Map<String,Object> delete(String id) {Map<String, Object> map = new HashMap<>();int num=dao.deleteById(id);map.put("success","刪除成功");return map;}}3.5 定時(shí)任務(wù)(兩個(gè))
import com.sws.course.dao.SocketDao; import com.sws.course.dto.Socket; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;import java.io.IOException; import java.net.ConnectException; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.List;@Component public class crontabSocket {@AutowiredSocketDao dao;@Scheduled(cron="0 0/1 * * * ? ") //每1分鐘執(zhí)行一次public void AnimalAechartsMapper() throws IOException, ParseException {java.net.Socket client = null;List<Socket> list=dao.findAll();for (int j=0;j<list.size();j++){String id=list.get(j).getId();String ip=list.get(j).getIp();String mc=list.get(j).getMc();String prot=list.get(j).getProt();int protInt=Integer.parseInt(prot);try{client = new java.net.Socket(ip, protInt);System.out.println("連接已建立...");Date time=getDate();dao.updateSocket(id,mc,ip,prot,"在線",time);} catch(ConnectException e) {System.out.println("未建立連接!!!");Date time=getDate();dao.updateSocket(id,mc,ip,prot,"離線",time);}}}public Date getDate() throws ParseException {DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Calendar calendar = Calendar.getInstance();String dateName = df.format(calendar.getTime());SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = sf.parse(dateName);return date;}} import com.sws.course.dao.SocketDao; import com.sws.course.dto.Socket; import org.apache.commons.mail.EmailException; import org.apache.commons.mail.HtmlEmail; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;import java.io.IOException; import java.text.ParseException; import java.util.List;@Component public class crontabEmail {@AutowiredSocketDao socketdao;@Scheduled(cron="0/5 * * * * ?") //每10分鐘執(zhí)行一次public void SendEamil() throws IOException, ParseException, EmailException {List<Socket> list=socketdao.findbyStatus();List<String> emailList =socketdao.findEmail();int num=list.size();if (num>0) {HtmlEmail email=new HtmlEmail();//創(chuàng)建一個(gè)HtmlEmail實(shí)例對(duì)象email.setHostName("smtp.163.com");//郵箱的SMTP服務(wù)器,一般123郵箱的是smtp.123.com,qq郵箱為smtp.qq.comemail.setCharset("utf-8");//設(shè)置發(fā)送的字符類型for (int i=0;i<emailList.size();i++){email.addTo(emailList.get(i));//設(shè)置收件人}email.setFrom("18629461220@163.com","服務(wù)端口監(jiān)測(cè)系統(tǒng)");//發(fā)送人的郵箱為自己的,用戶名可以隨便填email.setAuthentication("18629461220@163.com","xxxxxIBSVPURHA");//設(shè)置發(fā)送人到的郵箱和用戶名和授權(quán)碼(授權(quán)碼是自己設(shè)置的)email.setSubject("服務(wù)端口監(jiān)測(cè)系統(tǒng)-離線通知");//設(shè)置發(fā)送主題email.setMsg("1234");//設(shè)置發(fā)送內(nèi)容email.send();//進(jìn)行發(fā)送StringBuffer bodyBf = new StringBuffer();bodyBf.append("<!DOCTYPE html>");bodyBf.append("<HTML>");bodyBf.append("<HEAD>");bodyBf.append("<TITLE> 管理員你好</TITLE>");bodyBf.append("<meta http-equiv=Content-Type content=text/html; charset=utf-8>");bodyBf.append("</HEAD>");bodyBf.append("<BODY>");bodyBf.append("<h1 align=center style='color:rgb(5,112,255)'>服務(wù)端口監(jiān)測(cè)系統(tǒng) </h1>");bodyBf.append("<table border='1' align=center>");bodyBf.append("<thead><tr>");bodyBf.append("<tr><th>名稱</th><th>地址</th><th>端口</th></tr></thead><tbody>");for (int j=0;j<list.size();j++){String ip=list.get(j).getIp();String mc=list.get(j).getMc();String prot=list.get(j).getProt();bodyBf.append("<tr><th>"+mc+"</th><th>"+ip+"</th><th>"+prot+"</th></tr>");}bodyBf.append("</tbody></table>");bodyBf.append("</BODY>");bodyBf.append("</HTML>");//email.setMsg("您的驗(yàn)證碼是:123456");email.setHtmlMsg(bodyBf.toString());email.send();System.out.println("發(fā)送成功");}else{}} }4.前段代碼
<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><title>服務(wù)端口監(jiān)測(cè)系統(tǒng)</title><link rel="icon" href="./img/favicon.ico" type="image/x-icon"><link rel="stylesheet" href="./css/bootstrap.min.css"><script src="./js/jquery-3.4.1.min.js"></script><script src="./js/bootstrap.min.js"></script><link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css"><script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script><script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script><!-- Latest compiled and minified CSS --><link rel="stylesheet" href="https://unpkg.com/bootstrap-table@1.15.3/dist/bootstrap-table.min.css"><!-- Latest compiled and minified JavaScript --><script src="https://unpkg.com/bootstrap-table@1.15.3/dist/bootstrap-table.min.js"></script><!-- Latest compiled and minified Locales --><script src="https://unpkg.com/bootstrap-table@1.15.3/dist/locale/bootstrap-table-zh-CN.min.js"></script><script src="https://cdn.bootcdn.net/ajax/libs/layer/3.1.1/layer.js"></script></head> <style>/*定義滾動(dòng)條高寬及背景 高寬分別對(duì)應(yīng)橫豎滾動(dòng)條的尺寸*/::-webkit-scrollbar {width: 10px;height: 10px;background-color: #F5F5F5;}/*定義滾動(dòng)條軌道 內(nèi)陰影+圓角*/::-webkit-scrollbar-track {-webkit-box-shadow: inset 0 0 6px rgba(217, 223, 233);border-radius: 5px;background-color: #F5F5F5;}/*定義滑塊 內(nèi)陰影+圓角*/::-webkit-scrollbar-thumb {border-radius: 5px;-webkit-box-shadow: inset 0 0 6px rgba(217, 223, 233);background-color: rgba(217, 223, 233);}body {margin: 0;padding: 0;}#LoadTable{width: 800px;}.page-header{display: flex;justify-content:center;color: cornflowerblue;}#pagebody{display: flex;justify-content: center;}#離線{color: red;}#在線{color: green;}#add{position: absolute;right: 20px;bottom: 20px;}</style><body> <div class="page-header"><h1>歡迎來到服務(wù)端口監(jiān)測(cè)系統(tǒng)</h1> </div> <div id="pagebody"><div id="toolbar" class="btn-group"><button id="btn_add" type="button" onclick="btn_add()" class="btn btn-primary"><span class="glyphicon glyphicon-plus" aria-hidden="true" ></span>新增</button></div><table id="LoadTable"></table></div><script>$(function () {//1.初始化TableTableInit();});var TableInit = function () {var oTableInit = new Object();//初始化Table$('#LoadTable').bootstrapTable({url: "/Socket/findAll",columns: [{field: 'mc',title: '名稱'}, {field: 'ip',title: '地址'}, {field: 'prot',title: '端口'}, {field: 'status',title: '狀態(tài)',align: 'center',valign: 'middle',formatter: function(status){if(status=="離線"){return '<text type="text" style="color:#D9534F">'+status+'</text>';}else if(status=="在線"){return '<text type="text" style="color:#228B22" >'+status+'</text>';}else if(status=="待定"){return '<text type="text" style="color:#A9A9A9" >'+status+'</text>';}}},{field: 'time',title: '時(shí)間',align: 'center',valign: 'middle',},{field: 'id',title: '操作',align: 'center',valign: 'middle',formatter: function(id){return '<button type="button" class="btn btn-danger" onclick="deleteById(\''+id+'\')">刪除</button>';}}],method: 'post', //請(qǐng)求方式(*)toolbar: '#toolbar', //工具按鈕用哪個(gè)容器striped: true, //是否顯示行間隔色cache: false, //是否使用緩存,默認(rèn)為true,所以一般情況下需要設(shè)置一下這個(gè)屬性(*)pagination: true, //是否顯示分頁(*)sortable: false, //是否啟用排序sortOrder: "asc", //排序方式pageSize: 25, //每頁的記錄行數(shù)(*)clickToSelect: true, //是否啟用點(diǎn)擊選中行//height: 500, //行高,如果沒有設(shè)置height屬性,表格自動(dòng)根據(jù)記錄條數(shù)覺得表格高度uniqueId: "id", //每一行的唯一標(biāo)識(shí),一般為主鍵列});}var html='<form id="form_data" style="padding: 10px">\n' +' <div class="modal-body">\n' +' <div class="form-group">\n' +' <label for="mc">名稱</label>\n' +' <input type="text" class="form-control" id="mc" placeholder="某某數(shù)據(jù)庫">\n' +' </div>\n' +' <div class="form-group">\n' +' <label for="ip">地址/ip</label>\n' +' <input type="text" class="form-control" id="ip" placeholder="127.0.0.1">\n' +' </div>\n' +' <div class="form-group">\n' +' <label for="prot">端口/prot</label>\n' +' <input type="text" class="form-control" id="prot" placeholder="3306">\n' +' </div>\n' +' </div>\n' +' <div class="modal-footer">\n' +' <button type="button" onclick="add()" class="btn btn-primary">\n' +' 提交更改\n' +' </button>\n' +' </div>\n' +' </form>'function btn_add(){layer.open({type: 1,skin: 'layui-layer-rim', //加上邊框area: ['600px' ], //寬高content: html});}function deleteById(id){layer.confirm('你確認(rèn)要進(jìn)行刪除操作?', {btn: ['取消','確認(rèn)'] //按鈕}, function(){layer.msg('取消成功', {icon: 1});}, function(){$.ajax({type: "post",async:false,url: "/Socket/deleteById",data:{"id":id,},dataType: "json",success: function (response) {layer.msg('刪除成功', {time: 2000, //2s后自動(dòng)關(guān)閉});location.reload();},error: function (e) {alert("請(qǐng)求異常。");}});});}function add() {var mc = $.trim($('#mc').val());var ip = $.trim($('#ip').val());var prot = $.trim($('#prot').val());$.ajax({type: "post",async:false,url: "/Socket/add",data:{"mc":mc,"ip":ip,"prot":prot},dataType: "json",success: function (response) {layer.msg('添加成功', {time: 2000, //2s后自動(dòng)關(guān)閉});location.reload();},error: function (e) {alert("請(qǐng)求異常。");}});}</script> </body></html>?
?
總結(jié)
- 上一篇: 闽政通如何修改手机号
- 下一篇: 埋堆堆app用不了