blob: 50ce7b418b0a126eb764d4a58240674e9c611eab [file] [log] [blame]
package org.apache.tomcat.jni;
import java.io.InputStream;
import java.util.Properties;
/** Local Socket server example
*
* @author Mladen Turk
* @version $Revision$, $Date$
*/
public class LocalServer {
public static String serverAddr = null;
public static int serverNmax = 0;
public static int serverNrun = 0;
public static long serverPool = 0;
private static Acceptor serverAcceptor = null;
private static Object threadLock = new Object();
static {
try {
InputStream is = LocalServer.class.getResourceAsStream
("/org/apache/tomcat/jni/Local.properties");
Properties props = new Properties();
props.load(is);
is.close();
serverAddr = props.getProperty("local.path", null);
serverNmax = Integer.decode(props.getProperty("local.max", "0")).intValue();
}
catch (Throwable t) {
; // Nothing
}
}
public LocalServer()
{
serverPool = Pool.create(0);
try {
serverAcceptor = new Acceptor();
serverAcceptor.start();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void incThreads() {
synchronized(threadLock) {
serverNrun++;
}
}
public static void decThreads() {
synchronized(threadLock) {
serverNrun--;
}
}
/* Acceptor thread. Listens for new connections */
private class Acceptor extends java.lang.Thread {
private long serverSock = 0;
private long inetAddress = 0;
private long pool = 0;
public Acceptor() throws Exception {
try {
pool = Pool.create(LocalServer.serverPool);
System.out.println("Accepting: " + LocalServer.serverAddr);
serverSock = Local.create(LocalServer.serverAddr, pool);
int rc = Local.bind(serverSock, inetAddress);
if (rc != 0) {
throw(new Exception("Can't create Acceptor: bind: " + Error.strerror(rc)));
}
Local.listen(serverSock, LocalServer.serverNmax);
}
catch( Exception ex ) {
ex.printStackTrace();
throw(new Exception("Can't create Acceptor"));
}
}
public void run() {
int i = 0;
try {
while (true) {
long clientSock = Local.accept(serverSock);
System.out.println("Accepted id: " + i);
Socket.timeoutSet(clientSock, 10000000);
Worker worker = new Worker(clientSock, i++,
this.getClass().getName());
LocalServer.incThreads();
worker.start();
}
}
catch( Exception ex ) {
ex.printStackTrace();
}
}
}
private class Worker extends java.lang.Thread {
private int workerId = 0;
private long clientSock = 0;
private byte [] wellcomeMsg = null;
public Worker(long clientSocket, int workerId, String from) {
this.clientSock = clientSocket;
this.workerId = workerId;
wellcomeMsg = ("LocalServer server id: " + this.workerId + " from " +
from).getBytes();
}
public void run() {
boolean doClose = false;
try {
Socket.send(clientSock, wellcomeMsg, 0, wellcomeMsg.length);
while (!doClose) {
/* Do a blocking read byte at a time */
byte [] buf = new byte[1];
byte [] msg = new byte[256];
int p = 0;
while (Socket.recv(clientSock, buf, 0, 1) == 1) {
if (buf[0] == '\n')
break;
else if (buf[0] == '!') {
doClose = true;
break;
}
if (p > 250)
break;
msg[p++] = buf[0];
}
if (doClose) {
try {
byte [] snd = ("Bye from worker: " + workerId).getBytes();
Socket.send(clientSock, snd, 0, snd.length);
} catch(Exception e) { }
Socket.close(clientSock);
}
else
Socket.send(clientSock, msg, 0, p);
}
} catch (Exception e) {
Socket.destroy(clientSock);
e.printStackTrace();
}
LocalServer.decThreads();
System.out.println("Worker: " + workerId + " finished");
}
}
public static void main(String [] args) {
try {
Library.initialize(null);
LocalServer server = new LocalServer();
} catch (Exception e) {
e.printStackTrace();
}
}
}