Socket 监控服务器运行状态

想使用socket写一个跨服务器通信的监控小软件,用于收集服务器信息,雏形如下

服务端类

package test.serv;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Pattern;

public class Server {

    public static void main(String[] args) {
        
        // 启动3000端口
        int argnum = args.length;
        if (argnum < 2) {
            System.out.println("请输入IP地址、端口,比如:172.17.201.127 3000");
            return;
        }
        String ipaddr = getIP(args[0]);
        int port = Integer.valueOf(args[1]);
        startService(ipaddr,port);
        /*
        startService("10.168.150.107",3000);
        */
    }    
        
    /**     * 开启3000端口
     */
    public static void startService(String ipaddr,int port){
        ServerSocket server;
        BufferedReader br = null;
        try{
            server = new ServerSocket();
            server.setReuseAddress(true);
            server.bind(new InetSocketAddress(ipaddr,port));
            Socket sk = null;
            String context = "---服务器端开始接收消息-----";
            String filePath = "./log/"+getlognamebyweek();
            boolean isAppend = true;
            String encoding = "UTF-8";
            while(true){
                sk = server.accept();
                context="<-------服务器端开始接收消息----------->

";
                writeStringToFile(context, filePath, isAppend, encoding);
                br = new BufferedReader(
                        new InputStreamReader(sk.getInputStream()));
                context=br.readLine();
                writeStringToFile(context, filePath, isAppend, encoding);
                br.close();
                context="

<-------服务器端结束接收消息----------->

";
                writeStringToFile(context, filePath, isAppend, encoding);
            }
            
            
        }catch(IOException e){
            System.out.println(e);
        }finally{
            if (br!=null){
                try {
                    br.close();
                } catch (IOException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            }
        }
    }
    
    public static void writeStringToFile(String context, String filePath, boolean isAppend, String encoding)
      {
        BufferedWriter bfw = null;
        try {
          bfw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath, isAppend), encoding));
          bfw.write(context);
          bfw.flush();
          bfw.close();
        }
        catch (IOException localIOException1)
        {
          try
          {
            if (bfw != null)
              bfw.close();
          }
          catch (IOException e)
          {
            e.printStackTrace();
          }
        }
        finally
        {
          try
          {
            if (bfw != null)
              bfw.close();
          }
          catch (IOException e)
          {
            e.printStackTrace();
          }
        }
      }
    
    /**
     * 将主机名解析为IP
     * @param name
     * @return
     */
    public static String getIP(String name) {
        String pattern = "^[0-9]+.[0-9]+.[0-9]+.[0-9]+$";
        boolean isIP = Pattern.matches(pattern, name);
        if (isIP) {
            return name;
        }
        InetAddress address = null;
        try {
            address = InetAddress.getByName(name);
        } catch (UnknownHostException e) {
            e.printStackTrace();
            System.out.println("获取失败");
        }
        return address.getHostAddress().toString();
    }
    
    /**
     * 周一至周日每天一个日志
     * @return
     */
    public static String getlognamebyweek(){
          
          Date date=new Date();
          Calendar c=Calendar.getInstance();
          c.setTime(date);
          //今天是这个星期的第几天
          int week=c.get(Calendar.DAY_OF_WEEK)-1;
          return week+".log";
      }
}

客户端类

package test.serv;

import java.io.IOException;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.regex.Pattern;

public class Client {
    public static void main(String args[]){
        // 启动3000端口
        int argnum = args.length;
        if (argnum != 3) {
            System.out.println("请输入IP地址、端口,比如:172.17.201.127 3000 msg");
            return;
        }
        
        String ipaddr = getIP(args[0]);
        int port = Integer.valueOf(args[1]);
        String msg = args[2];
        
        Socket client;
        PrintStream ps;
        try{
            client = new Socket(ipaddr,port);
            System.out.println("客户端连接成功");
            ps = new PrintStream(client.getOutputStream());
            ps.println(msg);
            ps.close();
            client.close();
        }catch(IOException e){
            System.out.println();
        }
    }
    
    /**
     * 将主机名解析为IP
     * @param name
     * @return
     */
    public static String getIP(String name) {
        String pattern = "^[0-9]+.[0-9]+.[0-9]+.[0-9]+$";
        boolean isIP = Pattern.matches(pattern, name);
        if (isIP) {
            return name;
        }
        InetAddress address = null;
        try {
            address = InetAddress.getByName(name);
        } catch (UnknownHostException e) {
            e.printStackTrace();
            System.out.println("获取失败");
        }
        return address.getHostAddress().toString();
    }
}

测试

将编程后的.class类上传到服务器上

在被监控机上执行

[root@a12cdg1 scripts]# java test/serv/Server a12cdg1 3000

在监控机上执行

[root@a12csh4 scripts]# java test/serv/Client a12cdg1 3000 "磁盘使用率50%"
客户端连接成功

查看日志输出

[root@a12cdg1 log]# tailf 1.log

<-------服务器端开始接收消息----------->
磁盘使用率50%
<-------服务器端结束接收消息----------->

用于内部监控,网络不出内网,且限定了IP,安全上也没问题,这样两个服务器上就建立了基于TCP/IP的通信渠道,具体的监控内容计划使用python书写,然后以json方式返回给Java Socket。

原文地址:https://www.cnblogs.com/automng/p/8059115.html