VM Bridge protocol version 5.5 Requests are marked with "->", request arguments with -), responses with "<-". The server continues to process requests until EOF. Only the first character is significant. The communication must begin with ReferenceClass, CreateInstance, Invoke or PropertyAccess. If the client waits for a response (predicate==1) the server sends back a single ARG, as defined below. Returned object id's ("CID") are 32 bit unsigned integer values starting with 1, increased by 1. Example: $o = new java("java.lang.Long", 6); $o->toString(); // discard result -> <- -> <- -> -> A second example which shows how to avoid round-trips. $o = new java("java.lang.Long", 6); $o->toString(); // discard result -> -> # result from CreateInstance Optional requests: All acquired [O]bject handles may be destroyed by invoking U (destroy). However, the server tracks all handles and automatically destroys them after EOF. It is an error to further reference destroyed handles. If [F]inish is called, the server closes or recycles the connection and responds with F p=A, if the connection has been recycled, p=E otherwise. Instead of sending and waiting for the response, it is also possible to simply close the connection. Main requests: -> CreateInstance: ...ARGS... v: string p: char (Reference[C]lass, Create[I]nstance) -> Invoke: ...ARGS... v: unsigned long m: string p: char (examine[P]roperty, [I]nvoke method) When v=0, the call is directed to the current request-handling instance of the java bridge. -> ReferenceClass (alternate form) ...ARGS... p: char v: string Predicate 2 does not write a result, but stores a result proxy under ++CID. Predicate 3 does not write a result and does not create a result proxy. -> CreateInstance (alternate form) ...ARGS... p: char v: string Predicate 2 does not write a result, but stores a result proxy under ++CID. Predicate 3 does not write a result and does not create a result proxy. -> PropertyAccess (alternate form) ...ARGS... p: char v: unsigned long m: string Predicate 2 does not write a result, but stores a result proxy under ++CID. Predicate 3 does not write a result and does not create a result proxy. -> Invoke (alternate form) ...ARGS... p: char (examine[P]roperty, [I]nvoke method) v: unsigned long m: string Predicate 2 does not write a result, but stores a result proxy under ++CID. Predicate 3 does not write a result and does not create a result proxy. When v=0, the call is directed to the current request-handling instance of the java bridge. ARGS or response: <-) String: v: string <-) Boolean: v: char ([T]rue, [F]alse) -) Boolean:(alternate form) v: char [1]: true, everything else: false <-) Long: v: unsigned long p: char (p[O]sitive, neg[A]tive) -) Long: (alternate form) v: long (signed number) <-) Double: v: double -) Object: v: unsigned long NULL values can be sent as either v="" or v="0" <- Object: v: unsigned long m: string p: char ([A]rray/Map, [C]ollection, [O]bject, [E]xception) n: char result can be cached (T) or not (F) <- Null: <- Void: n: char result can be cached (T) or not (F) <- Apply: ...PAIRS... v: unsigned long p: string m: string n: unsigned long Result can be used to send back the result of the current apply call. If v is null, the function name p must be searched in the "current" environment. -> Result: ...ARG... <-) Exception: v: unsigned long m: T signals an unchecked exception, F a checked exception. Unchecked exceptions (e.g.: RuntimeException or Error) should terminate the script immediately <-) Composite: ...PAIRS... t: char ([A]rray, [H]ashtable) <-) Pair:

...ARG...

t: char (key is [N]umeric, [S]tring or doesn't exist (if X=A)) v: unsigned long (if X=H and t=N) v: string (if X=H and t=S) OPTIONAL requests: -> Destroy: v: unsigned long <-> EndConnection: p: char (Keep [A]live, [E]nd connection). Lower-case letters signal that an unchecked exception occured during script execution. NOTES: If the first byte is 0177, the following byte has a special meaning: Bit 1 0 ------- return values binary comment as proxies(*) data 0 0 yes binary default 0 1 no binary if JAVA_PREFER_VALUES=1 1 0 no base64 encoded if JAVA_PREFER_VALUES=1 1 1 yes base64 encoded default Bit 2,3,4: log level (from java.log_level) Bit 5: always 0 Bit 6: set to 1 if bit[0,1] are used Bit 7: set to 1 if bit[2,4] are used If the header is missing, the following default values are used return values binary comment as proxies(*) data no base64 encoded default (*) Primitive values like null, 1, false, etc. are proxied by Request$PhpNull, Integer, Boolean, etc. by default. Process communication --------------------- 1) a simple client connects to a simple socket listener 2) php connects to a simple socket or unix-domain socket listener 3) php connects to a JEE server 4) php is running within a JEE server ad 1) client opens socket connection client sends protocol requests client closes the socket connection ad 2) php opens a socket connection php sends the bytes \0177 OPTIONS to initiate the communication php sends protocol requests php finishes the communication sending java sends back a ... php transparently re-uses the socket connection php sends the bytes \0177 OPTIONS php sends protocol requests php finishes the communication sending java sends back a php closes the socket connection ad 3) php opens a HTTP socket connection to ${JAVA_HOSTS}[0] e.g.: localhost:8080 php sends PUT ${JAVA_SERVLET}\r\rTransfer-Encoding: chunked\r\n\r\n e.g.: PUT /JavaBridge/servlet.phpjavabridge\r\n\r\n php sends the bytes \0177 OPTIONS to initiate the communication php sends protocol requests java servlet responds with protocol responses php finishes the communication sending java servlet sends back a php sends final chunk: 0000\r\n\r\n java servlet sends final chunk: 0000\r\n\r\n php closes the socket connection ad 4) php opens a socket connection php sends the bytes \0177 OPTIONS LEN_ID[1] LEN_ID[0] ID java thread sends \0 to avoid ack delay[1] php sends protocol requests php finishes the communication sending java thread sends back a ... php transparently re-uses the socket connection php sends the bytes \0177 OPTIONS LEN_ID[1] LEN_ID[0] ID java thread sends \0 to avoid ack delay[1] php sends protocol requests php finishes the communication sending java thread sends back a php closes the socket connection [1] write/write/read delay is up to 500ms on free bsd operating system. NOTES ----- It is possible to "ping" the server by sending it the byte 0x0. If alive it will send back a 0x0.