mturk 2005/06/24 01:22:58 Modified: jni build.xml Added: jni/examples/org/apache/tomcat/jni Local.properties LocalServer.java jni/java/org/apache/tomcat/jni Local.java Log: Added Local network implementation and example. Revision Changes Path 1.9 +4 -4 jakarta-tomcat-connectors/jni/build.xml Index: build.xml =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jni/build.xml,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- build.xml 10 Jun 2005 17:15:55 -0000 1.8 +++ build.xml 24 Jun 2005 08:22:58 -0000 1.9 @@ -309,13 +309,13 @@ <jvmarg value="-Djava.library.path=${tc.library.path}"/> </java> </target> - <target name="bioserver-example" depends="examples"> - <echo message="Running another Tomcat Native SSL Server example ..."/> - <java dir="${examples.dir}" classname="org.apache.tomcat.jni.BIOSSLServer" + <target name="locals-example" depends="examples"> + <echo message="Running Tomcat Native Local Server example ..."/> + <java dir="${examples.dir}" classname="org.apache.tomcat.jni.LocalServer" fork="yes" failonerror="${test.failonerror}"> + <classpath refid="examples.classpath"/> <env key="PATH" path="${tc.library.path}:${java.library.path}"/> <env key="Path" path="${tc.library.path}:${java.library.path}"/> - <classpath refid="examples.classpath"/> <jvmarg value="-Djava.library.path=${tc.library.path}"/> </java> </target> 1.1 jakarta-tomcat-connectors/jni/examples/org/apache/tomcat/jni/Local.properties Index: Local.properties =================================================================== # Local properties local.max=10 # For NT Pipes use something like local.path=\\\\.\\PIPE\\test # For Unix Sockets use # local.path=/tmp/testsock 1.1 jakarta-tomcat-connectors/jni/examples/org/apache/tomcat/jni/LocalServer.java Index: LocalServer.java =================================================================== package org.apache.tomcat.jni; import java.util.Properties; import java.io.*; import java.net.*; import java.lang.*; /** Local Socket server example * * @author Mladen Turk * @version $Revision: 1.1 $, $Date: 2005/06/24 08:22:58 $ */ 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() { int i; 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 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 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(); } } } 1.1 jakarta-tomcat-connectors/jni/java/org/apache/tomcat/jni/Local.java Index: Local.java =================================================================== /* * Copyright 1999-2004 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.tomcat.jni; /** Local socket * * @author Mladen Turk * @version $Revision: 1.1 $, $Date: 2005/06/24 08:22:58 $ */ public class Local { /** * Create a socket. * @param path The address of the new socket. * @param cont The parent pool to use * @return The new socket that has been set up. */ public static native long create(String path, long cont) throws Exception; /** * Bind the socket to its associated port * @param sock The socket to bind * @param sa The socket address to bind to * This may be where we will find out if there is any other process * using the selected port. */ public static native int bind(long sock, long sa); /** * Listen to a bound socket for connections. * @param sock The socket to listen on * @param backlog The number of outstanding connections allowed in the sockets * listen queue. If this value is less than zero, for NT pipes * the number of instances is unlimite. * */ public static native int listen(long sock, int backlog); /** * Accept a new connection request * @param sock The socket we are listening on. * @param pool The pool for the new socket. * @return A copy of the socket that is connected to the socket that * made the connection request. This is the socket which should * be used for all future communication. */ public static native long accept(long sock) throws Exception; /** * Issue a connection request to a socket either on the same machine * or a different one. * @param sock The socket we wish to use for our side of the connection * @param sa The address of the machine we wish to connect to. * Unused for NT Pipes. */ public static native int connect(long sock, long sa); }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]