package org.opendedup.sdfs.network;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.opendedup.sdfs.Config;
import org.opendedup.sdfs.Main;
import org.opendedup.sdfs.filestore.FileChunkStore;
import org.opendedup.sdfs.servers.HashChunkService;
public class NetworkHCServer {
// Declaration section:
// declare a server socket and a client socket for the server
// declare an input and an output stream
static Socket clientSocket = null;
static ServerSocket serverSocket = null;
private static Logger log = Logger.getLogger("sdfs");
private static NioUDPServer udpServer = null;
// This chat server can accept up to 10 clients' connections
public static void main(String args[]) {
// The default port
if (args.length < 1) {
System.out.println("Usage: NetworkHCServer <configFile>");
} else {
ShutdownHook shutdownHook = new ShutdownHook();
Runtime.getRuntime().addShutdownHook(shutdownHook);
try {
Config.parseHubStoreConfigFile(args[0]);
} catch (IOException e1) {
log.severe("exiting because of an error with the config file");
}
init();
}
}
public static void init() {
HashChunkService.init();
// Initialization section:
// Try to open a server socket on port port_number (default 2222)
// Note that we can't choose a port less than 1023 if we are not
// privileged users (root)
try {
InetSocketAddress addr = new InetSocketAddress(Main.serverHostName,
Main.serverPort);
if (Main.useUDP) {
udpServer = new NioUDPServer();
}
serverSocket = new ServerSocket();
serverSocket.bind(addr);
log.info("listening on " + addr.toString());
} catch (Exception e) {
e.printStackTrace();
log.log(Level.SEVERE, "unable to open network ports", e);
System.exit(-1);
}
// Create a socket object from the ServerSocket to listen and accept
// connections.
// Open input and output streams for this socket will be created in
// client's thread since every client is served by the server in
// an individual thread
while (true) {
try {
clientSocket = serverSocket.accept();
clientSocket.setKeepAlive(true);
clientSocket.setTcpNoDelay(true);
new ClientThread(clientSocket).start();
} catch (IOException e) {
log.log(Level.SEVERE,"Unable to open port " + e.toString(),e);
}
}
}
public static void close() {
try {
serverSocket.close();
} catch (Exception e) {
}
try {
udpServer.close();
} catch (Exception e) {
}
HashChunkService.close();
FileChunkStore.closeAll();
}
}
class ShutdownHook extends Thread {
public void run() {
System.out
.println("###################### Shutting down StorageHub #################################");
NetworkHCServer.close();
}
}