src/java/isac/bridge/Clients2KernelServer.java
author mlang
Tue, 28 Jun 2005 13:14:03 +0200
changeset 2544 631fe7f467b7
parent 2450 e9695b3ac2ae
child 2708 b174da5b71f4
permissions -rw-r--r--
cosmetics part2
rgradisc@1158
     1
/*
rgradisc@1158
     2
 * Created on Aug 21, 2003
rgradisc@1158
     3
 */
rgradisc@1158
     4
package isac.bridge;
rgradisc@1158
     5
rgradisc@1158
     6
/**
rgradisc@1158
     7
 * @author rgradisc
rgradisc@1158
     8
 */
rgradisc@1158
     9
rgradisc@1158
    10
import java.io.IOException;
rgradisc@1158
    11
import java.net.ServerSocket;
rgradisc@1158
    12
import java.net.Socket;
rgradisc@1158
    13
wneuper@1862
    14
import org.apache.log4j.Logger;
wneuper@1862
    15
rgradisc@1158
    16
/**
mlang@2450
    17
 * Clients2KernelServer: runs in its own thread and handles the communication
mlang@2450
    18
 * from clients to the kernel
mlang@2450
    19
 * 
rgradisc@1158
    20
 * @author rgradisc
rgradisc@1158
    21
 */
rgradisc@1158
    22
public class Clients2KernelServer implements Runnable {
wneuper@1862
    23
mlang@2450
    24
    private ServerSocket server_ = null;
rgradisc@1158
    25
mlang@2450
    26
    private BridgeMain bridge_;
mlang@2450
    27
mlang@2544
    28
    static Logger logger_ = Logger.getLogger(Clients2KernelServer.class
mlang@2450
    29
            .getName());
mlang@2450
    30
mlang@2450
    31
    /**
mlang@2450
    32
     * Constructor: create a new Clients2KernelServer
mlang@2450
    33
     * 
mlang@2450
    34
     * @param bridge_
mlang@2450
    35
     */
mlang@2450
    36
    public Clients2KernelServer(BridgeMain bridge) {
mlang@2544
    37
        logger_.warn("Clients2KernelServer: bridge_=" + bridge);
mlang@2450
    38
        this.bridge_ = bridge;
rgradisc@1158
    39
    }
rgradisc@1158
    40
mlang@2450
    41
    /**
mlang@2450
    42
     * Listen on socket: Wait for clients to connect to bridge_, and once the
mlang@2450
    43
     * connect, start a new ClientOutputWorker that sends the XML-output back to
mlang@2450
    44
     * the client
mlang@2450
    45
     */
mlang@2450
    46
    public void listenSocket() {
mlang@2450
    47
        ClientOutputWorker w;
mlang@2450
    48
        Socket socket;
mlang@2450
    49
        try {
mlang@2450
    50
            server_ = new ServerSocket(bridge_.getSocketPort());
mlang@2450
    51
        } catch (IOException e) {
mlang@2450
    52
            bridge_.log(1, "Could not listen on port "
mlang@2450
    53
                    + bridge_.getSocketPort());
mlang@2450
    54
            System.out.println("Could not listen on port "
mlang@2450
    55
                    + bridge_.getSocketPort());
mlang@2450
    56
            System.exit(-1);
mlang@2450
    57
        }
mlang@2450
    58
        while (true) {
mlang@2450
    59
            try {
mlang@2450
    60
                //TODO id should be fetched from the BridgeMain:
mlang@2450
    61
                //smallestFreeBridgeRmiID
mlang@2450
    62
                //(so far: only one BridgeRMI)
mlang@2450
    63
                int id = 1;
mlang@2450
    64
                socket = server_.accept(); // wait for client connections
mlang@2450
    65
                bridge_.log(1, "connection received");
mlang@2450
    66
                w = new ClientOutputWorker(id, socket, bridge_);
mlang@2450
    67
                Thread t = new Thread(w, "java_bridge_clientworker" + id);
mlang@2450
    68
                t.setDaemon(true);
mlang@2450
    69
                t.start();
mlang@2450
    70
                bridge_.log(1, "new Client accepted, id=" + id);
mlang@2450
    71
                //TODO if to much load, start new kernel: e.g.
mlang@2450
    72
                // bridge_.startNewKernel();
mlang@2450
    73
mlang@2450
    74
            } catch (IOException e) {
mlang@2450
    75
                bridge_.log(1, "Accept failed on port"
mlang@2450
    76
                        + bridge_.getSocketPort());
mlang@2450
    77
                System.out.println("Accept failed on port"
mlang@2450
    78
                        + bridge_.getSocketPort());
mlang@2450
    79
                //Quit program: could not connect to port
mlang@2450
    80
                System.exit(-1);
mlang@2450
    81
            }
mlang@2450
    82
        }
rgradisc@1158
    83
    }
rgradisc@1158
    84
mlang@2450
    85
    /**
mlang@2450
    86
     * This starts the Client2KernelServer thread
mlang@2450
    87
     */
mlang@2450
    88
    public void run() {
mlang@2450
    89
        listenSocket();
mlang@2450
    90
        try {
mlang@2450
    91
            bridge_.log(1, "Clients2KernelServer: Cleaning up...");
mlang@2450
    92
            server_.close();
rgradisc@1158
    93
mlang@2450
    94
        } catch (IOException e) {
mlang@2450
    95
            bridge_.log(1, "Could not close socket");
mlang@2450
    96
            System.exit(-1);
mlang@2450
    97
        }
mlang@2450
    98
        bridge_.log(1, "Done cleaning up");
rgradisc@1158
    99
    }
mlang@2450
   100
}