Handler
package io.tiago.server;
import io.tiago.domain.Caller;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.TimeUnit;
public class Handler implements Runnable {
private final static Logger LOGGER = Logger.getLogger(Handler.class.getName());
private final static String MSG = "Server listen on %s:%s is up: %s";
private Socket clientSocket;
public Handler(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
try {
LOGGER.info("Start checking services...");
PrintWriter out = new PrintWriter(clientSocket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream());
Caller c = (Caller) in.readObject();
if (isScheduledRangeTime(c)) {
TimeUnit.SECONDS.sleep(c.getPollFrequency());
if(!givenService(c).isUp()) {
TimeUnit.MILLISECONDS.sleep(c.getExpire());
}
String message = String.format(MSG, c.getHost(), c.getPort(), c.isUp());
out.write(message);
out.flush();
out.close();
in.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private Caller givenService(Caller caller) {
try (Socket socket = new Socket()) {
LOGGER.info(String.format("Checking host %s:%s...", caller.getHost(), caller.getPort()));
SocketAddress socketAddress = new InetSocketAddress(caller.getHost(), caller.getPort());
socket.connect(socketAddress);
caller.setUp(true);
} catch (IOException e) {
caller.setUp(false);
}
return caller;
}
private boolean isScheduledRangeTime(Caller c) {
LocalTime now = LocalTime.now();
return now.isAfter(c.getStart()) && now.isBefore(c.getEnd());
}
}
Socket Server
package io.tiago.server;
import org.apache.log4j.Logger;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private final static Logger LOGGER = Logger.getLogger(Server.class.getName());
private final static int DEFAULT_SERVER_PORT = 6000;
public static void main(String[] args) {
Server s = new Server();
s.start();
}
private void start() {
LOGGER.info("Starting server.");
try (ServerSocket serverSocket = new ServerSocket(DEFAULT_SERVER_PORT)) {
while (!Thread.currentThread().isInterrupted()) {
Socket clientSocket = serverSocket.accept();
new Thread(new Handler(clientSocket)).start();
}
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
}
}
POJO
package io.tiago.domain;
import java.io.Serializable;
import java.time.LocalTime;
public class Caller implements Serializable {
private int pollFrequency;
private LocalTime start;
private LocalTime end;
private long expire;
private String host;
private int port;
private boolean up;
public int getPollFrequency() {
return pollFrequency;
}
public void setPollFrequency(int pollFrequency) {
this.pollFrequency = pollFrequency;
}
public LocalTime getStart() {
return start;
}
public void setStart(LocalTime start) {
this.start = start;
}
public LocalTime getEnd() {
return end;
}
public void setEnd(LocalTime end) {
this.end = end;
}
public long getExpire() {
return expire;
}
public void setExpire(long expire) {
this.expire = expire;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public boolean isUp() {
return up;
}
public void setUp(boolean up) {
this.up = up;
}
}
package io.tiago.client;
import io.tiago.domain.Caller;
import org.apache.log4j.Logger;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.time.LocalTime;
import java.util.Scanner;
public class Client {
private final static Logger LOGGER = Logger.getLogger(Client.class.getName());
public static void main(String[] args) {
Client client = new Client();
System.out.print("Enter host ip: ");
Scanner sc = new Scanner(System.in);
String host = sc.nextLine();
System.out.print("Enter port number: ");
sc = new Scanner(System.in);
int port = sc.nextInt();
System.out.print("Enter poll frequency: ");
sc = new Scanner(System.in);
int pollFreq = sc.nextInt();
System.out.print("Enter schedule start time (HH:mm): ");
sc = new Scanner(System.in);
LocalTime startTime = LocalTime.parse(sc.nextLine());
System.out.print("Enter schedule end time (HH:mm): ");
sc = new Scanner(System.in);
LocalTime endTime = LocalTime.parse(sc.nextLine());
System.out.print("Enter expiration time in milliseconds: ");
sc = new Scanner(System.in);
long expirationTime = sc.nextLong();
Caller caller = new Caller();
caller.setPollFrequency(pollFreq);
caller.setStart(startTime);
caller.setEnd(endTime);
caller.setExpire(expirationTime);
caller.setHost(host);
caller.setPort(port);
new Thread(() -> client.register(caller)).start();
}
private void register(Caller caller) {
while (!Thread.currentThread().isInterrupted()) {
try (Socket clientSocket = new Socket("127.0.0.1", 6000)) {
ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
out.writeObject(caller);
String result = in.readLine();
LOGGER.info(result);
out.close();
in.close();
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
}
}
}