111 lines
4.1 KiB
Java
111 lines
4.1 KiB
Java
|
|
/*
|
||
|
|
* Copyright (c) 2008,2009 Declarative Engineering LLC.
|
||
|
|
* All rights reserved. This program and the accompanying materials
|
||
|
|
* are made available under the terms of the Declarative Engineering LLC
|
||
|
|
* verson 1 which accompanies this distribution, and is available at
|
||
|
|
* http://declarativeengineering.com/legal/DE_Developer_License_v1.txt
|
||
|
|
*/
|
||
|
|
package com.de22.orb;
|
||
|
|
|
||
|
|
import java.io.IOException;
|
||
|
|
import java.net.InetAddress;
|
||
|
|
import java.net.ServerSocket;
|
||
|
|
import java.net.Socket;
|
||
|
|
|
||
|
|
import com.common.debug.Debug;
|
||
|
|
import com.common.event.VoidHandler1;
|
||
|
|
import com.common.event.VoidHandler2;
|
||
|
|
import com.common.thread.ThreadService;
|
||
|
|
|
||
|
|
public class StServerSocket extends AbstractConnectionServer {
|
||
|
|
/** The underlying server socket. */
|
||
|
|
private ServerSocket serverSocket = null;
|
||
|
|
/** The listener thread. */
|
||
|
|
private Thread listener = null;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* The runnable for a server socket to manage and thread the processing of new client sockets.
|
||
|
|
*/
|
||
|
|
private class ServerSocketRunnable implements Runnable {
|
||
|
|
public void run() {
|
||
|
|
while(serverSocket != null) {
|
||
|
|
try {
|
||
|
|
acceptSocket();
|
||
|
|
}//try//
|
||
|
|
catch(java.net.SocketException e) {
|
||
|
|
break;
|
||
|
|
}//catch//
|
||
|
|
catch(Throwable e) {
|
||
|
|
Debug.log(e);
|
||
|
|
Debug.halt();
|
||
|
|
break;
|
||
|
|
}//catch//
|
||
|
|
}//while//
|
||
|
|
}//run()//
|
||
|
|
}//ServerSocketRunnable//
|
||
|
|
/**
|
||
|
|
* StServerSocket constructor.
|
||
|
|
*/
|
||
|
|
public StServerSocket() {
|
||
|
|
}//StServerSocket()//
|
||
|
|
/**
|
||
|
|
* Accepts a socket connection through the server socket.
|
||
|
|
* @return The socket that was accepted.
|
||
|
|
*/
|
||
|
|
public AbstractConnection acceptSocket() throws IOException {
|
||
|
|
StConnection result = null;
|
||
|
|
Socket socket = serverSocket.accept();
|
||
|
|
|
||
|
|
if(socket != null) {
|
||
|
|
result = new StConnection(getNextSessionId(), getServerSocketOptions().getAutoReconnectTimeLimit());
|
||
|
|
registerConnection(result);
|
||
|
|
result.initialize(getOrb(), socket, this, getMessageHandler(), getInitCompleteHandler());
|
||
|
|
Debug.log("Socket listener started on: " + result.getNameAndPort() + " connecting via server socket: " + this.getNameAndPort());
|
||
|
|
}//if//
|
||
|
|
|
||
|
|
return result;
|
||
|
|
}//acceptSocket()//
|
||
|
|
/* (non-Javadoc)
|
||
|
|
* @see com.de22.orb.AbstractServerSocket#close()
|
||
|
|
*/
|
||
|
|
public void close() throws IOException {
|
||
|
|
if(serverSocket != null) {
|
||
|
|
try {
|
||
|
|
serverSocket.close();
|
||
|
|
}//try//
|
||
|
|
catch(Throwable e) {
|
||
|
|
}//catch//
|
||
|
|
|
||
|
|
//Set the server socket reference to null so everyone knows this server socket is not open.//
|
||
|
|
serverSocket = null;
|
||
|
|
|
||
|
|
//If there is a server socket runnable then stop it.//
|
||
|
|
if(listener != null) {
|
||
|
|
//Don't need to do this at this time. Closing the socket will take care of this for us.//
|
||
|
|
//listener.interrupt();
|
||
|
|
}//if//
|
||
|
|
|
||
|
|
super.close();
|
||
|
|
}//if//
|
||
|
|
}//close()//
|
||
|
|
/**
|
||
|
|
* Initializes the server socket for use.
|
||
|
|
* The user may call the acceptSocket() method after this method has successfully returned.
|
||
|
|
* @param orb The orb that created the server socket.
|
||
|
|
* @param options The server socket options used to setup the server socket.
|
||
|
|
* @param address An optional address only used to optimize performance since the caller often will have to get this address before deciding to create a new server socket.
|
||
|
|
* @param classLoader The class loader that the server socket and all accepted sockets will use for loading classes.
|
||
|
|
* @param messageHandler The handler called to process a message after the bytes have been read from the stream.
|
||
|
|
* @param initCompleteHandler The handler called to finish the initialization process (after all initialization of the socket has finished).
|
||
|
|
*/
|
||
|
|
public void initialize(Orb orb, IServerSocketOptions options, InetAddress address, ClassLoader classLoader, VoidHandler2 messageHandler, VoidHandler1 initCompleteHandler) throws IOException {
|
||
|
|
//Setup the address if necessary.//
|
||
|
|
if((address == null) && (options.getAddress().getName() != null)) {
|
||
|
|
address = InetAddress.getByName(options.getAddress().getName());
|
||
|
|
}//if//
|
||
|
|
|
||
|
|
super.initialize(orb, options, address, classLoader, messageHandler, initCompleteHandler);
|
||
|
|
serverSocket = new ServerSocket(options.getAddress().getPort(), (options.getBacklog() != null ? options.getBacklog().intValue() : 50), address);
|
||
|
|
listener = ThreadService.run(new ServerSocketRunnable(), false);
|
||
|
|
}//internalInitialize()//
|
||
|
|
}//StServerSocket//
|