Example showing how to use an OScript Socket to write data to a background Java ServerSocket.
1. Compile and package the Java source (note the dependencies).
2. Copy the resulting jar file and the Apache Commons IO library to your (OTHome | module) ojlib directory.
3. Create a new script file in OScript using the source below.
4. Run the OScript script.
DISCLAIMER: Obviously, this code is more educational than production quality.
Java source library dependencies:
* Apache Commons IO
* OpenText oml.jar file from %OTHOME%\ojlib\oml.jar
//// OSCRIPT SOURCE CODE BEGIN ////
Integer counter, port, start
Socket sock
Dynamic joResult
String path, clazz, methServerSocketForFile, crlf
List parms
Boolean ok
start = Date.Tick()
crlf = Str.Ascii(13) + Str.Ascii(10)
path = "C:\TEMP\output.txt"
clazz = "com.capspire.cs.example.SocketListenerExample"
methServerSocketForFile = "getServerSocketForFile"
parms = { path }
joResult = JavaObject.InvokeStaticMethod(clazz, methServerSocketForFile, parms)
if (IsError(joResult))
echo(joResult)
else
port = joResult
sock = Socket.Create()
Socket.Connect( sock, "localhost", port )
for counter = 1 to 1000000
ok = Socket.Write( sock, Str.Format("This is line %1%2", counter, crlf) )
if (!ok)
echo("Failed to write to socket!")
break
end
if ( counter % 1000 == 0)
echo(" counter: ", counter)
end
end
Socket.Flush( sock )
Socket.Close( sock)
end
echo("duration: ", Date.Tick() - start)
//// OSCRIPT SOURCE CODE END ////
//// JAVA SOURCE CODE BEGIN ////
package com.capspire.cs.example;
import com.opentext.livelink.oml.OScriptObject;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import org.apache.commons.io.IOUtils;
public class SocketListenerExample {
/**
* OScript will call this, passing a string path.
*/
public static synchronized int getServerSocketForFile(final String path) {
return getServerSocketForFile(new File(path));
}
public static synchronized int getServerSocketForFile(final File output) {
final Integer port;
try {
final ServerSocket listener = new ServerSocket(0);
//if connection not established within ten seconds, kill socket listener
listener.setSoTimeout(10000);
port = listener.getLocalPort();
echo(String.format("[SocketListenerExample.getServerSocketForFile] listener established on port %s", port));
final Runnable job = new Runnable() {
public void run() {
Socket socket = null;
try {
socket = listener.accept();
final InputStream is = socket.getInputStream();
final OutputStream os = new FileOutputStream(output);
boolean done;
do {
int piped = IOUtils.copy(is, os);
done = (piped == 0);
} while (!done);
os.close();
is.close();
} catch (Exception e) {
System.err.println(e.getLocalizedMessage());
} finally {
if ((socket != null) && (!socket.isConnected())) {
try {
socket.close();
} catch (IOException ioe) {
//do nothing, throwing it away anyway
}
}
}
}
};
final Thread t = new Thread(job);
t.start();
} catch (Throwable t) {
throw new RuntimeException(String.format(
"Encountered error while generating a ServerSocket. Error: %s",
t.getLocalizedMessage()));
}
return port;
}
private static void echo(String msg) {
try {
OScriptObject.runScript("echo", msg);
} catch (Throwable e) {
System.out.println(msg);
}
}
}
//// JAVA SOURCE CODE END ////
Comments