exception maxPacketLength in BASE24TCPChannel

331 views
Skip to first unread message

Juan

unread,
Mar 23, 2009, 6:32:41 PM3/23/09
to jPOS Users
In my previous post

http://groups.google.com/group/jpos-users/t/602ed653d981cca0?hl=es

I used a BASE24Channel and everything worked fine, but when i change
my channel, my iso server generate this exception and is repeated for
each reconnect.

The Exception->
receive length 0 seems strange - maxPacketLength = 100000
org.jpos.iso.ISOException: receive length 0 seems strange -
maxPacketLength = 100000

sorry so long.

thanks

all the code.....

#################################################################
the log of de ISO-SERVER (simulate remote host) IP 127.0.0.1 PORT 1995
#################################################################

<log realm="iso-server" at="Mon Mar 23 15:54:24 GMT-06:00 2009.203">
<iso-server>
listening on port 1995
</iso-server>
</log>
<log realm="iso-server.session/127.0.0.1" at="Mon Mar 23 15:55:16
GMT-06:00 2009.357">
<session-start/>
</log>
<log realm="channel-side/127.0.0.1:1871" at="Mon Mar 23 15:55:16
GMT-06:00 2009.357">
<get-message-length/>
</log>
<log realm="channel-side/127.0.0.1:1871" at="Mon Mar 23 15:55:19
GMT-06:00 2009.357">
<got-message-length>
1
</got-message-length>
</log>
<log realm="channel-side/127.0.0.1:1871" at="Mon Mar 23 15:55:19
GMT-06:00 2009.357">
<receive>
<iso-exception>
receive length 0 seems strange - maxPacketLength = 100000
org.jpos.iso.ISOException: receive length 0 seems strange -
maxPacketLength = 100000
at org.jpos.iso.BaseChannel.receive(BaseChannel.java:609)
at org.jpos.iso.ISOServer$Session.run(ISOServer.java:144)
at org.jpos.util.ThreadPool$PooledThread.run(ThreadPool.java:72)
</iso-exception>
</receive>
</log>
<log realm="iso-server.session/127.0.0.1" at="Mon Mar 23 15:55:19
GMT-06:00 2009.357">
<session-error>
<iso-exception>
receive length 0 seems strange - maxPacketLength = 100000
org.jpos.iso.ISOException: receive length 0 seems strange -
maxPacketLength = 100000
at org.jpos.iso.BaseChannel.receive(BaseChannel.java:609)
at org.jpos.iso.ISOServer$Session.run(ISOServer.java:144)
at org.jpos.util.ThreadPool$PooledThread.run(ThreadPool.java:72)
</iso-exception>
</session-error>
</log>

#################################################################
the log of my Q2 IP 127.0.0.1 PORT 8000
#################################################################

<log realm="Q2.system" at="Mon Mar 23 16:13:38 GMT-06:00 2009.142">
<info>
Q2 started, deployDir=C:\Eclipse\workspaces_34_cvs
\creditCarProcesor1.6\deploy
</info>
</log>
<log realm="Q2.system" at="Mon Mar 23 16:13:38 GMT-06:00 2009.142">
<info>
deploy:C:\Eclipse\workspaces_34_cvs\creditCarProcesor1.6\deploy
\99_sysmon.xml
</info>
</log>
<log realm="Q2.system" at="Mon Mar 23 16:13:38 GMT-06:00 2009.157">
<info>
deploy:C:\Eclipse\workspaces_34_cvs\creditCarProcesor1.6\deploy
\adaptor.xml
</info>
</log>
<log realm="Q2.system" at="Mon Mar 23 16:13:38 GMT-06:00 2009.173">
<info>
deploy:C:\Eclipse\workspaces_34_cvs\creditCarProcesor1.6\deploy
\bsh.xml
</info>
</log>
<log realm="Q2.system" at="Mon Mar 23 16:13:38 GMT-06:00 2009.267">
<info>
deploy:C:\Eclipse\workspaces_34_cvs\creditCarProcesor1.6\deploy
\multiplexor.xml
</info>
</log>
<log realm="Q2.system" at="Mon Mar 23 16:13:38 GMT-06:00 2009.282">
<info>
deploy:C:\Eclipse\workspaces_34_cvs\creditCarProcesor1.6\deploy
\server.xml
</info>
</log>
<log realm="Q2.system" at="Mon Mar 23 16:13:38 GMT-06:00 2009.298">
<info>
deploy:C:\Eclipse\workspaces_34_cvs\creditCarProcesor1.6\deploy
\space.xml
</info>
</log>
<log realm="Q2.system" at="Mon Mar 23 16:13:38 GMT-06:00 2009.314">
<info>
deploy:C:\Eclipse\workspaces_34_cvs\creditCarProcesor1.6\deploy
\ui.xml
</info>
</log>
<log realm="org.jpos.q2.qbean.SystemMonitor" at="Mon Mar 23 16:13:38
GMT-06:00 2009.314">
<info>
Starting SystemMonitor
</info>
</log>
<log realm="org.jpos.q2.qbean.SystemMonitor" at="Mon Mar 23 16:13:38
GMT-06:00 2009.314">
<info>
<release>1.6.2$Revision: 2626 $</release>
<memory>
freeMemory=3791552
totalMemory=5177344
inUseMemory=1385792
</memory>
<threads>
delay=0 ms
threads=3
Thread[Reference Handler,10,system]
Thread[Finalizer,8,system]
Thread[Signal Dispatcher,9,system]
Thread[Attach Listener,5,system]
Thread[main,5,main]
Thread[Timer-0,5,main]
Thread[SystemMonitor,5,main]
</threads>
--- name-registrar ---
mux.mux: org.jpos.q2.iso.QMUX
tx=0, rx=0, tx_expired=0, tx_pending=0, rx_expired=0,
rx_pending=0, rx_unhandled=0, rx_forwarded=0, connected=true
tspace:default: org.jpos.space.TSpace
logger.Q2: org.jpos.util.Logger
</info>
</log>
Hello BSH Script
<log realm="xml-server.server" at="Mon Mar 23 16:13:38 GMT-06:00
2009.517">
<iso-server>
listening on port 8000
</iso-server>
</log>
<log realm="channel/127.0.0.1:1995" at="Mon Mar 23 16:13:38 GMT-06:00
2009.517">
<connect>
localhost:1995
</connect>
</log>
<log realm="channel/127.0.0.1:1995" at="Mon Mar 23 16:13:38 GMT-06:00
2009.532">
<get-message-length/>
</log>
<log realm="channel/127.0.0.1:1995" at="Mon Mar 23 16:13:58 GMT-06:00
2009.532">
<receive>
<peer-disconnect>Connection reset</peer-disconnect>
</receive>
</log>
<log realm="org.jpos.q2.iso.ChannelAdaptor" at="Mon Mar 23 16:13:58
GMT-06:00 2009.532">
<warn>
channel-receiver-creditCarProcesor-receive
<exception name="Connection reset">
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
at java.io.DataInputStream.readFully(DataInputStream.java:178)
at org.jpos.iso.channel.BASE24TCPChannel.getMessageLength
(BASE24TCPChannel.java:106)
at org.jpos.iso.BaseChannel.receive(BaseChannel.java:588)
at org.jpos.q2.iso.ChannelAdaptor$Receiver.run(ChannelAdaptor.java:
303)
at java.lang.Thread.run(Thread.java:619)
</exception>
</warn>
</log>
<log realm="channel/127.0.0.1:1995" at="Mon Mar 23 16:14:19 GMT-06:00
2009.547">
<connect>
localhost:1995
</connect>
</log>
<log realm="channel/127.0.0.1:1995" at="Mon Mar 23 16:14:19 GMT-06:00
2009.547">
<get-message-length/>
</log>
<log realm="channel/127.0.0.1:1995" at="Mon Mar 23 16:14:39 GMT-06:00
2009.562">
<receive>
<peer-disconnect>Connection reset</peer-disconnect>
</receive>
</log>
<log realm="org.jpos.q2.iso.ChannelAdaptor" at="Mon Mar 23 16:14:39
GMT-06:00 2009.562">
<warn>
channel-receiver-creditCarProcesor-receive
<exception name="Connection reset">
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
at java.io.DataInputStream.readFully(DataInputStream.java:178)
at org.jpos.iso.channel.BASE24TCPChannel.getMessageLength
(BASE24TCPChannel.java:106)
at org.jpos.iso.BaseChannel.receive(BaseChannel.java:588)
at org.jpos.q2.iso.ChannelAdaptor$Receiver.run(ChannelAdaptor.java:
303)
at java.lang.Thread.run(Thread.java:619)
</exception>
</warn>
</log>

#################################################################
the code
ISOServerInit.java
this clase simulate mi credit card procesor, the channel adapter
conect this clase
#################################################################

import java.awt.BorderLayout;
import java.io.IOException;
import java.util.Observable;
import xx.com.bank.listener.CreditCardProcesorListenerbank;
import xx.com.bank.ui.Panel;
import org.jpos.iso.ISOException;
import org.jpos.iso.ISOServer;
import org.jpos.iso.ServerChannel;
import org.jpos.iso.channel.BASE24TCPChannel;
import org.jpos.iso.gui.ISOChannelPanel;
import org.jpos.iso.packager.GenericPackager;
import org.jpos.util.Logger;
import org.jpos.util.SimpleLogListener;
import org.jpos.util.ThreadPool;

public class ISOServerInit implements Runnable {

private static ISOChannelPanel channelPanel;
static Observable observer;
static CreditCardProcesorListenerbank vs = new
CreditCardProcesorListenerbank();
private static Panel palen2;
BASE24TCPChannel clientSideChannel = null;
Logger logger = new Logger();

public static void main(String args[]) {
try {
ISOServerInit panel = new ISOServerInit();
palen2 = new Panel(vs);
new Thread(panel).start();
} catch (Exception e) {
System.out.println("Error ISO SERVER->" + e);
}
}

public void run() {
logger.addListener(new SimpleLogListener(System.out));
try {
clientSideChannel = new BASE24TCPChannel(new GenericPackager(
"cfg/packager/base24.xml"));
clientSideChannel.setName("channel-side");
clientSideChannel.setLogger(logger, "channel-side");
} catch (IOException ex) {
System.out.println("Error ISO SERVER->" + ex);
} catch (ISOException e) {
System.out.println("Error ISO SERVER->" + e);
}
new Thread(createServer()).start();

}

private ISOServer createServer() {
ThreadPool pool = new ThreadPool(5, 30);
pool.setLogger(logger, "iso-server-pool");
ISOServer server = new ISOServer(1995,
(ServerChannel) clientSideChannel, pool);
server.setName("iso-server");
server.setLogger(logger, "iso-server");
server.addISORequestListener(vs);
channelPanel = createChannelPanel();
palen2.setLayout(new BorderLayout());
palen2.add(channelPanel);
server.addObserver(channelPanel);
return server;
}

private ISOChannelPanel createChannelPanel() {
Logger logger = new Logger();
logger.addListener(new SimpleLogListener(System.out));
return new ISOChannelPanel(clientSideChannel, "localhost:1995");
}

}

#################################################################
my channel adaptor adaptor.xml
#################################################################

<channel-adaptor name='co_opChannel'
class="org.jpos.q2.iso.ChannelAdaptor"
logger="Q2">
<channel name="channel.co_opChannel"
class="org.jpos.iso.channel.BASE24TCPChannel"
logger="Q2" packager="org.jpos.iso.packager.GenericPackager">
<property name="host" value="localhost" />
<property name="port" value="1995" />
<property name="packager-config" value="cfg/packager/base24.xml" />
</channel>
<in>creditCarProcesor-send</in>
<out>creditCarProcesor-receive</out>
<reconnect-delay>20000</reconnect-delay>
<keep-alive>yes</keep-alive>
</channel-adaptor>
#################################################################
my mux.xml multiplexor.xml
#################################################################
<?xml version="1.0" encoding="UTF-8"?>
<mux class="org.jpos.q2.iso.QMUX" logger="Q2" name="mux">
<in>creditCarProcesor-receive</in>
<out>creditCarProcesor-send</out>
<!--<ready>postilion1.ready postilion2.ready</ready>-->
<unhandled>mux.unhandled</unhandled>
<key>11</key>
</mux>
#################################################################
my server.xml
#################################################################

<?xml version="1.0" encoding="UTF-8"?>
<server name="xml-server" class="org.jpos.q2.iso.QServer" logger="Q2">
<attr name="port" type="java.lang.Integer">8000</attr>
<channel name="dummyclient.channel"
class="org.jpos.iso.channel.BASE24TCPChannel"
packager="org.jpos.iso.packager.GenericPackager" logger="Q2">
<property name="packager-config" value="cfg/packager/base24.xml" />
</channel>
<request-listener class="xx.com.bann¡k.listener.GatewayBankListener"
logger="Q2">
</request-listener>
</server>

#################################################################
GatewayBankListenerextends.java
#################################################################

package xx.com.bank.listener;

import java.io.IOException;
import org.jpos.iso.ISOException;
import org.jpos.iso.ISOMsg;
import org.jpos.iso.ISORequestListener;
import org.jpos.iso.ISOSource;
import org.jpos.q2.iso.QMUX;
import org.jpos.util.Log;
import org.jpos.util.NameRegistrar;

public class GatewayBankListenerextends Log implements
ISORequestListener {

@Override
public boolean process(ISOSource source, ISOMsg m) {
ISOMsg responseISOMsg = null;
QMUX mux = null;
//m.dump(System.out,"b");
try {
mux = (QMUX) NameRegistrar.get("mux.mux");
mux.setLogger ("mux");
responseISOMsg = mux.request(m, 5000);
} catch (NameRegistrar.NotFoundException ex) {
fatal("error->" + ex);
} catch (ISOException ex) {
fatal("errror->" + ex);
}
try {
if (responseISOMsg!= null) {
source.send(responseISOMsg);
} else {
source.send(null);
throw new ISOException("null pointer");
}
} catch (IOException ex) {
fatal("error->" + ex);
} catch (ISOException ex) {
fatal("error->" + ex);
}
return true;
}
}


Alejandro Revilla

unread,
Mar 23, 2009, 7:47:15 PM3/23/09
to jpos-...@googlegroups.com
Looks like a Channel/wire-protocol mismatch to me.

Mark Salter

unread,
Mar 24, 2009, 4:13:13 AM3/24/09
to jpos-...@googlegroups.com
GatewayBankListenerextends Juan wrote:
> In my previous post
>
> http://groups.google.com/group/jpos-users/t/602ed653d981cca0?hl=es
>
> I used a BASE24Channel and everything worked fine, but when i change
> my channel, my iso server generate this exception and is repeated for
> each reconnect.
>
> The Exception->
> receive length 0 seems strange - maxPacketLength = 100000
> org.jpos.iso.ISOException: receive length 0 seems strange -
> maxPacketLength = 100000

As Alejandro points out, you need to be sure your Channel implementation
match on both sides of the send/receive.

Base24TCPChannel has handling for null echo messages. If a zero length
message arrives, it echos one back to the 'requestor'

The Channel is currently seeing a message of 1 byte long, which it
reduces by 1 (to make 0) which then fails the BaseChannel check for a
'sensible' length.

If the code sending a message to you server is not sending a two byte
binary length, then you will have trouble. Base24Channel overrides
BaseChannel.streamReceive() to split the stream on an ETX (x'03').
These Channels are not interchangeable.


--
Mark

Juan

unread,
Mar 24, 2009, 5:20:21 PM3/24/09
to jPOS Users
I undestand the difference, but I say before used BASE24Channel for my
test, but my credit card procesor use Base24 with TCP, I changed the
BASE24Channel to BASE24TCPChannel and I recieved.

The Exception->
receive length 0 seems strange - maxPacketLength = 100000
org.jpos.iso.ISOException: receive length 0 seems strange -
maxPacketLength = 100000


the problem is here protected int getMessageLength() throws
IOException, ISOException { }
in this line (BASE24TCPChannel.java)
serverIn.readFully(b,0,2);

If I return to the previous configuration, everything works fine.

do yo know why?

Mark Salter

unread,
Mar 24, 2009, 5:54:40 PM3/24/09
to jpos-...@googlegroups.com
Juan wrote:
> I undestand the difference, but I say before used BASE24Channel for my
> test, but my credit card procesor use Base24 with TCP, I changed the
> BASE24Channel to BASE24TCPChannel and I recieved.
>
> The Exception->
> receive length 0 seems strange - maxPacketLength = 100000
> org.jpos.iso.ISOException: receive length 0 seems strange -
> maxPacketLength = 100000

This means that the length handling is not the same on the sending and
receiving parts of the exchange, I think we have stated this already?

>
>
> the problem is here protected int getMessageLength() throws
> IOException, ISOException { }
> in this line (BASE24TCPChannel.java)
> serverIn.readFully(b,0,2);

This is not a problem as long as the sender is also passing a two byte
binary length.

>
> If I return to the previous configuration, everything works fine.

Which configuration - your test one? Your test is not valid if it is
not mimicking your processor's network protocol?

The structure your processor is sending does not match
BASE24TCPChannel's length structures. I think you are relying too much
on the name of this Channel and forgetting to check what length format
it is expecting.

Each of these channels do very different things with their lengths and
it appears that your processor does something different again.

So, when your processor says they are sending "BASE24 over TCP", what
does this really mean; how do they send their message length - how many
bytes and what format?

With the above answer and we may move forward.

--
Mark

Juan

unread,
Mar 25, 2009, 5:40:31 PM3/25/09
to jPOS Users
Mark, see that..

Because this method is a subtraction in the end one position?, if I
send 1 element, the length is 1, but this method subtraction one and
the (l) variable always always be zero.

Another perspective,

I did some tests with my card processor, they sent me 334 positions,
then this method remains for me a position, the cell 103 and wait 30
elements, but at a diminishing before unpacking, there are only 29 and
provides an exception.

protected int getMessageLength() throws IOException, ISOException {
int l = 0;
byte[] b = new byte[2];
Logger.log (new LogEvent (this, "getMessageLength-message-
length"));
while (l == 0) {
serverIn.readFully(b,0,2);
System.out.println("getMessageLength->"+new String(b));
l = ((((int)b[0])&0xFF) << 8) | (((int)b[1])&0xFF);
if (l == 0) {
serverOut.write(b);
serverOut.flush();
}
}
Logger.log (new LogEvent (this, "got-message-length",
Integer.toString(l)));
return l - 1; // trailler length <<<<<<-------------- HERE IS
THE PROBLEM WHY ???

Mark Salter

unread,
Mar 26, 2009, 3:37:09 AM3/26/09
to jpos-...@googlegroups.com
Juan wrote:

>
> Because this method is a subtraction in the end one position?, if I
> send 1 element, the length is 1, but this method subtraction one and
> the (l) variable always always be zero.

So, I would suggest once more that this Channel does *not* match the
network protocol you are using it against.

The length of the message is reduced by one so that there will be a byte
left on serverIn to be read as the trailer in getMessageTrailler().

The comment does suggest this is the case?

Now, here is the thing..

In my opinion it is a little strange to have a trailer that looks like
it was an ETX within a TCP/IP exchange. it is a throw back to the time
when this bytes was needed to indicate the end of a message - over a
serial connection. This is fine in this case, as the person that wrote
and likely uses this channel needed it that way.

Because you are reading BASE24 in the name, you are expecting it to work
with your setup, and are surprised when it doesn't.

I did say that these Channels were quite different and were not
interchangeable.

In my previous response I said:-

"
So, when your processor says they are sending "BASE24 over TCP", what
does this really mean; how do they send their message length - how many
bytes and what format?

With the above answer and we may move forward.
"

Could you take a shot at answering this please?


>
> Another perspective,
>
> I did some tests with my card processor, they sent me 334 positions,
> then this method remains for me a position, the cell 103 and wait 30
> elements, but at a diminishing before unpacking, there are only 29 and
> provides an exception.
>
> protected int getMessageLength() throws IOException, ISOException {
> int l = 0;
> byte[] b = new byte[2];
> Logger.log (new LogEvent (this, "getMessageLength-message-
> length"));
> while (l == 0) {
> serverIn.readFully(b,0,2);
> System.out.println("getMessageLength->"+new String(b));
> l = ((((int)b[0])&0xFF) << 8) | (((int)b[1])&0xFF);
> if (l == 0) {
> serverOut.write(b);
> serverOut.flush();
> }
> }
> Logger.log (new LogEvent (this, "got-message-length",
> Integer.toString(l)));
> return l - 1; // trailler length <<<<<<-------------- HERE IS
> THE PROBLEM WHY ???
> }

This is a 'problem' because you are using a channel that expects a
trailer byte and implements that fact. I think you are using a Channel
that does not match your processors.

--
Mark

Juan

unread,
Mar 26, 2009, 10:39:00 AM3/26/09
to jPOS Users
Built a channel, publish it here if it works, tailored to my needs.

Mark Salter

unread,
Mar 26, 2009, 10:54:36 AM3/26/09
to jpos-...@googlegroups.com
Juan wrote:
> Built a channel, publish it here if it works, tailored to my needs.

You have one that works for you, or is the 'working' measure still to be
determined?

--
Mark

Juan

unread,
Mar 26, 2009, 12:51:47 PM3/26/09
to jPOS Users
Yes, I was builded my own channel class. We have tested and everything
worked properly.

The differences are very few BASE24TCPChannel, was implemented
postConnectHook first and then delete the getMessageTrailler and the
return getMessageLength l-1; was replacement by return l;

Worthwhile to create another class just for these few changes?

Mark Salter

unread,
Mar 26, 2009, 1:14:09 PM3/26/09
to jpos-...@googlegroups.com
Juan wrote:
> Yes, I was builded my own channel class. We have tested and everything
> worked properly.
Great, forming a Channel that matches your target host was the key, glad
you got there.

>
> The differences are very few BASE24TCPChannel, was implemented
> postConnectHook first and then delete the getMessageTrailler and the
> return getMessageLength l-1; was replacement by return l;
>
> Worthwhile to create another class just for these few changes?

The existing class already has a use, so your specific channel does need
to be kept separate.

I suggest you keep hold of it for now. If someone has the same need as
you, then they will find this discussion and can ask after it if you
indicate you could contribute it back.


--
Mark

Juan

unread,
Mar 26, 2009, 6:10:38 PM3/26/09
to jPOS Users
One question,

It's valid this model?

Can I use XMLChannel to communicate my clients with QServer and then
the channel adapter with the processing of credit cards with a
different channel.

http://jpos-users.googlegroups.com/web/Model1.jpg?hl=es&gsc=4F3YowsAAAD0nl83oXnwDq7Yfl67VvmF

Mark Salter

unread,
Mar 26, 2009, 6:58:35 PM3/26/09
to jpos-...@googlegroups.com
Juan wrote:
> One question,
>
> It's valid this model?
>
> Can I use XMLChannel to communicate my clients with QServer and then
> the channel adapter with the processing of credit cards with a
> different channel.
>
> http://jpos-users.googlegroups.com/web/Model1.jpg?hl=es&gsc=4F3YowsAAAD0nl83oXnwDq7Yfl67VvmF

As long as something (the ISORequestListener perhaps) is converting the
data in the xml message into fields in the message out to your processor
and from the processor's response message back to xml for the client, it
could work.

Your IP addresses and ports look a little strange. If your QServer
listens for connections on 100.20.32.34:8000 then your channel to your
processor will not also use that port. As illustrated, your channel
will attempt to connect with your QServer? Perhaps just an error in
your drawing?


--
Mark

Juan

unread,
Mar 26, 2009, 8:23:48 PM3/26/09
to jPOS Users
IP addresses are only an invention, I wanted to enforce the model.

And if clients use jPOS 1.4.8, owing to the application you can only
use JDK 1.4.2, there is some incompatibility with the Q2 in jPOS 1.6 ?

On 26 mar, 16:58, Mark Salter <marksal...@talktalk.net> wrote:
> Juan wrote:
> > One question,
>
> > It's valid this model?
>
> > Can I  use XMLChannel  to communicate my clients with QServer and then
> > the channel adapter with the processing of credit cards with a
> > different channel.
>
> >http://jpos-users.googlegroups.com/web/Model1.jpg?hl=es&gsc=4F3YowsAA...

Andres Alcarraz

unread,
Mar 26, 2009, 11:09:03 PM3/26/09
to jpos-...@googlegroups.com
Hello Juan, the JVM in wich the clients are executing has nothing to do with the VM of the server, the only link between the client and the server is the TCP/IP stack.

Andrés

Juan escribió:
Reply all
Reply to author
Forward
0 new messages