001 package org.crsh.util;
002
003 import java.io.Closeable;
004 import java.io.IOException;
005 import java.io.InputStream;
006 import java.io.OutputStream;
007 import java.net.InetSocketAddress;
008 import java.net.ServerSocket;
009 import java.net.Socket;
010
011 /** @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> */
012 public abstract class AbstractSocketServer implements Closeable {
013
014 /** . */
015 private final int bindingPort;
016
017 /** . */
018 private ServerSocket socketServer;
019
020 /** . */
021 private Socket socket;
022
023 /** . */
024 private InputStream in;
025
026 /** . */
027 private OutputStream out;
028
029 /** . */
030 private int port;
031
032 public AbstractSocketServer(int bindingPort) {
033 this.bindingPort = bindingPort;
034 }
035
036 public final int getBindingPort() {
037 return socketServer.getLocalPort();
038 }
039
040 public final int getPort() {
041 return port;
042 }
043
044 public final int bind() throws IOException {
045 ServerSocket socketServer = new ServerSocket();
046 socketServer.bind(new InetSocketAddress(bindingPort));
047 int port = socketServer.getLocalPort();
048
049 //
050 this.socketServer = socketServer;
051 this.port = port;
052
053 //
054 return port;
055 }
056
057 public final void accept() throws IOException {
058 if (socketServer == null) {
059 throw new IllegalStateException();
060 }
061
062 //
063 this.socket = socketServer.accept();
064 this.in = socket.getInputStream();
065 this.out = socket.getOutputStream();
066
067 //
068 handle(in, out);
069 }
070
071 protected abstract void handle(InputStream in, OutputStream out) throws IOException;
072
073 public final void close() {
074 try {
075 Safe.close(socket);
076 Safe.close(in);
077 Safe.close(out);
078 }
079 finally {
080 this.socket = null;
081 this.in = null;
082 this.out = null;
083 }
084 }
085 }