ossiejhmoore icon

OScript / Java | Socket Communication

ossiejhmoore | PRO | 12/22/15 04:38:42 AM UTC | 0 ⭐ | 589 👁️ | Never ⏰ | []
Java |

4.32 KB

|

None

|

0 👍

/

0 👎

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