I'll try to answer for first question. I'm sure others with come forth with the answers to the second.

To have a single thread handle more clients depends on if you need SSL or not[1].

JSO was designed so that a single thread could indeed handle the processing of multiple sessions (or at least appear that way). If you use the ChannelStreamSource, then all processing is done on the thread that calls Stream.process(). If you use the SocketStreamSource (or its derivatives), then there is actually another thread running to handle the I/O.

Assuming there are no SSL requirements, you could do this using the ChannelStreamSource and a java.nio.channels.Selector. Just ensure the selectable channel for the source is set to non-blocking and register it with the Selector (preferrably passing along the Stream that will be using it for the attachment):

conn = JSOImplementation.getInstance().createStream("jabber:client");
src = ChannelStreamSource.createSocket(host, port);

conn.connect(src);
conn.open();
src.register(selector, SelectionKey.OP_READ, conn);

Then call Selector.select() to retrieve the available selection keys, and process the attached Streams:

while (selector.select() > 0) {
Iterator itr = selector.selectedKeys().iterator();
SelectionKey key;
Stream conn;

while (itr.hasNext()) {
key = (SelectionKey)itr.next();
conn = (Stream)key.attachment();

conn.process();
if (!conn.getCurrentStatus().isConnected())
key.cancel(); //Stream disconnected; remove from selector
}
}

I believe there is an example to this effect in example/EchoServer.java.

Hope this helps.



[1] With J2SE 1.4, there is no open implementation of TLS that works with non-blocking I/O (that I am aware of). With J2SE 5, there is, but no work as been done with it in JSO (although it is fairly easy to implement, I believe).

--
-  LW

GOT JABBER™? <http://www.jabber.org/>

_______________________________________________
jdev mailing list
[email protected]
http://mail.jabber.org/mailman/listinfo/jdev

Reply via email to