<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<body link="#355491" alink="#4262a1" vlink="#355491" style="background: #e2e2e2; margin: 0; padding: 20px;">
<div>
        <table cellpadding="0" bgcolor="#FFFFFF" border="0" cellspacing="0" style="border: 1px solid #dadada; margin-bottom: 30px; width: 100%; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
                <tbody>
                        <tr>
                                <td>
                                        <table border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" style="border: solid 2px #ccc; background: #dadada; width: 100%; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
                                                <tbody>
                                                        <tr>
                                                                <td bgcolor="#000000" valign="middle" height="58px" style="border-bottom: 1px solid #ccc; padding: 20px; -moz-border-radius-topleft: 3px; -moz-border-radius-topright: 3px; -webkit-border-top-right-radius: 5px; -webkit-border-top-left-radius: 5px;">
                                                                        <h1 style="color: #333333; font: bold 22px Arial, Helvetica, sans-serif; margin: 0; display: block !important;">
                                                                        <!-- To have a header image/logo replace the name below with your img tag -->
                                                                        <!-- Email clients will render the images when the message is read so any image -->
                                                                        <!-- must be made available on a public server, so that all recipients can load the image. -->
                                                                        <a href="https://community.jboss.org/index.jspa" style="text-decoration: none; color: #E1E1E1">JBoss Community</a></h1>
                                                                </td>
                                                        </tr>
                                                        <tr>
                                                                <td bgcolor="#FFFFFF" style="font: normal 12px Arial, Helvetica, sans-serif; color:#333333; padding: 20px; -moz-border-radius-bottomleft: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 5px; -webkit-border-bottom-left-radius: 5px;"><h3 style="margin: 10px 0 5px; font-size: 17px; font-weight: normal;">
JBoss Remoting 3 HelloWorld Sample
</h3>
<span style="margin-bottom: 10px;">
modified by <a href="https://community.jboss.org/people/kylin">Kylin Soong</a> in <i>JBoss Remoting Development</i> - <a href="https://community.jboss.org/docs/DOC-51182">View the full document</a>
</span>
<hr style="margin: 20px 0; border: none; background-color: #dadada; height: 1px;">
<div class="jive-rendered-content"><p><span style="font-size: 12pt;"><strong>What's the JBoss Remoting 3 HelloWorld Sample</strong></span></p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>JBoss Remoting is wide used in JBoss Application Server, Remoting 3 is the next generation of JBoss Remoting, this article will provide a quick start sample for using JBoss Remoting 3.</p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>More about JBoss Remoting 3 please refer to <a class="jive-link-external-small" href="https://www.jboss.org/jbossremoting/remoting-3">https://www.jboss.org/jbossremoting/remoting-3</a></p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>The HelloWorld Sample's architecture like below:</p><p><a href="https://community.jboss.org/servlet/JiveServlet/showImage/21315/remoting3_sample.png"><span> https://community.jboss.org/servlet/JiveServlet/downloadImage/21315/remoting3_sample.png </span></a></p><ul><li style="text-align: start;">CharSequenceReceiver play a role as Server, it use JBoss Remoting 3, listen on localhost/30123, it will output every received char sequence.</li><li style="text-align: start;">CharSequenceSender play a role as Client, it connect to Server, create a Remoting 3 Connection, use this connection it can send char sequence repeated</li></ul><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p><span style="font-size: 12pt;"><strong>Source Code</strong></span></p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><pre class="jive-pre"><code class="jive-code jive-java"><font color="navy"><b>package</b></font> org.jboss.remoting3.sample;
 
<font color="navy"><b>import</b></font> java.io.IOException;
<font color="navy"><b>import</b></font> java.net.InetSocketAddress;
 
<font color="navy"><b>import</b></font> org.jboss.remoting3.Channel;
<font color="navy"><b>import</b></font> org.jboss.remoting3.Endpoint;
<font color="navy"><b>import</b></font> org.jboss.remoting3.MessageInputStream;
<font color="navy"><b>import</b></font> org.jboss.remoting3.OpenListener;
<font color="navy"><b>import</b></font> org.jboss.remoting3.Remoting;
<font color="navy"><b>import</b></font> org.jboss.remoting3.remote.RemoteConnectionProviderFactory;
<font color="navy"><b>import</b></font> org.jboss.remoting3.security.SimpleServerAuthenticationProvider;
<font color="navy"><b>import</b></font> org.jboss.remoting3.spi.NetworkServerProvider;
<font color="navy"><b>import</b></font> org.xnio.IoUtils;
<font color="navy"><b>import</b></font> org.xnio.OptionMap;
<font color="navy"><b>import</b></font> org.xnio.Options;
<font color="navy"><b>import</b></font> org.xnio.Sequence;
<font color="navy"><b>import</b></font> org.xnio.channels.AcceptingChannel;
<font color="navy"><b>import</b></font> org.xnio.channels.ConnectedStreamChannel;
 
<font color="navy"><b>public</b></font> <font color="navy"><b>class</b></font> CharSequenceReceiver <font color="navy">{</font>
 
    <font color="navy"><b>private</b></font> <font color="navy"><b>static</b></font> <font color="navy"><b>final</b></font> <font color="navy"><b>int</b></font> THREAD_POOL_SIZE = 100;
    <font color="navy"><b>private</b></font> <font color="navy"><b>static</b></font> <font color="navy"><b>final</b></font> <font color="navy"><b>int</b></font> BUFFER_SIZE = 8192;
    <font color="navy"><b>private</b></font> <font color="navy"><b>static</b></font> <font color="navy"><b>byte</b></font>[] buffer;
 
    <font color="navy"><b>protected</b></font> <font color="navy"><b>final</b></font> Endpoint serverEndpoint;
 
    <font color="navy"><b>private</b></font> AcceptingChannel<? <font color="navy"><b>extends</b></font> ConnectedStreamChannel> server;
 
    <font color="navy"><b>public</b></font> CharSequenceReceiver() <font color="navy"><b>throws</b></font> IOException <font color="navy">{</font>
        serverEndpoint = Remoting.createEndpoint(<font color="red">"connection-test-server"</font>, OptionMap.create(Options.WORKER_TASK_CORE_THREADS, THREAD_POOL_SIZE, Options.WORKER_TASK_MAX_THREADS, THREAD_POOL_SIZE));
        serverEndpoint.addConnectionProvider(<font color="red">"remote"</font>, <font color="navy"><b>new</b></font> RemoteConnectionProviderFactory(), OptionMap.create(Options.SSL_ENABLED, Boolean.FALSE));
        <font color="navy"><b>final</b></font> NetworkServerProvider networkServerProvider = serverEndpoint.getConnectionProviderInterface(<font color="red">"remote"</font>, NetworkServerProvider.class);
        SimpleServerAuthenticationProvider provider = <font color="navy"><b>new</b></font> SimpleServerAuthenticationProvider();
        provider.addUser(<font color="red">"bob"</font>, <font color="red">"test"</font>, <font color="red">"pass"</font>.toCharArray());
        server = networkServerProvider.createServer(<font color="navy"><b>new</b></font> InetSocketAddress(<font color="red">"localhost"</font>, 30123), OptionMap.create(Options.SASL_MECHANISMS, Sequence.of(<font color="red">"CRAM-MD5"</font>)), provider, <font color="navy"><b>null</b></font>);
        System.out.println(<font color="red">"Server Created, "</font> + server.getLocalAddress());
 
        serverEndpoint.registerService(<font color="red">"test"</font>, <font color="navy"><b>new</b></font> OpenListener()<font color="navy">{</font>
 
            <font color="navy"><b>public</b></font> <font color="navy"><b>void</b></font> channelOpened(Channel channel) <font color="navy">{</font>
                channel.receiveMessage(<font color="navy"><b>new</b></font> Channel.Receiver()<font color="navy">{</font>
 
                    <font color="navy"><b>public</b></font> <font color="navy"><b>void</b></font> handleError(Channel channel, IOException error) <font color="navy">{</font>
 
                    <font color="navy">}</font>
 
                    <font color="navy"><b>public</b></font> <font color="navy"><b>void</b></font> handleEnd(Channel channel) <font color="navy">{</font>
<font color="darkgreen">//                        System.out.println(channel.getConnection().getRemoteEndpointName() + " ended");</font>
                    <font color="navy">}</font>
 
                    <font color="navy"><b>public</b></font> <font color="navy"><b>void</b></font> handleMessage(Channel channel, MessageInputStream message) <font color="navy">{</font>
                        <font color="navy"><b>try</b></font> <font color="navy">{</font>
                            channel.receiveMessage(<font color="navy"><b>this</b></font>);
                            buffer = <font color="navy"><b>new</b></font> <font color="navy"><b>byte</b></font>[BUFFER_SIZE];
                            <font color="navy"><b>while</b></font> (message.read(buffer) > -1);
                            System.out.println(<font color="red">"    Receive: "</font> + <font color="navy"><b>new</b></font> String(buffer));
                        <font color="navy">}</font> <font color="navy"><b>catch</b></font> (Exception e) <font color="navy">{</font>
                            e.printStackTrace();
                        <font color="navy">}</font> <font color="navy"><b>finally</b></font> <font color="navy">{</font>
                            IoUtils.safeClose(message);
                        <font color="navy">}</font>
                    <font color="navy">}</font>
                <font color="navy">}</font>);
            <font color="navy">}</font>
 
            <font color="navy"><b>public</b></font> <font color="navy"><b>void</b></font> registrationTerminated() <font color="navy">{</font>
 
            <font color="navy">}</font><font color="navy">}</font>, OptionMap.EMPTY);
    <font color="navy">}</font>
 
 
    <font color="navy"><b>public</b></font> <font color="navy"><b>static</b></font> <font color="navy"><b>void</b></font> main(String[] args) <font color="navy"><b>throws</b></font> IOException <font color="navy">{</font>
        <font color="navy"><b>new</b></font> CharSequenceReceiver();
    <font color="navy">}</font>
 
<font color="navy">}</font>
</code></pre><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><pre class="jive-pre"><code class="jive-code jive-java"><font color="navy"><b>package</b></font> org.jboss.remoting3.sample;
 
<font color="navy"><b>import</b></font> java.io.BufferedReader;
<font color="navy"><b>import</b></font> java.io.IOException;
<font color="navy"><b>import</b></font> java.io.InputStreamReader;
<font color="navy"><b>import</b></font> java.net.InetSocketAddress;
 
<font color="navy"><b>import</b></font> org.jboss.remoting3.Channel;
<font color="navy"><b>import</b></font> org.jboss.remoting3.Connection;
<font color="navy"><b>import</b></font> org.jboss.remoting3.Endpoint;
<font color="navy"><b>import</b></font> org.jboss.remoting3.MessageOutputStream;
<font color="navy"><b>import</b></font> org.jboss.remoting3.Registration;
<font color="navy"><b>import</b></font> org.jboss.remoting3.Remoting;
<font color="navy"><b>import</b></font> org.jboss.remoting3.remote.RemoteConnectionProviderFactory;
<font color="navy"><b>import</b></font> org.xnio.IoFuture;
<font color="navy"><b>import</b></font> org.xnio.IoUtils;
<font color="navy"><b>import</b></font> org.xnio.OptionMap;
<font color="navy"><b>import</b></font> org.xnio.Options;
 
<font color="navy"><b>public</b></font> <font color="navy"><b>class</b></font> CharSequenceSender <font color="navy">{</font>
 
    <font color="navy"><b>private</b></font> <font color="navy"><b>static</b></font> <font color="navy"><b>final</b></font> Integer THREAD_POOL_SIZE = 100;
 
    <font color="navy"><b>protected</b></font> <font color="navy"><b>final</b></font> Endpoint clientEndpoint;
 
    <font color="navy"><b>protected</b></font> <font color="navy"><b>final</b></font> Registration clientReg;
 
    <font color="navy"><b>protected</b></font> <font color="navy"><b>final</b></font> Connection conn;
 
    <font color="navy"><b>public</b></font> CharSequenceSender() <font color="navy"><b>throws</b></font> IOException <font color="navy">{</font>
        clientEndpoint = Remoting.createEndpoint(<font color="red">"connection-test-client"</font>, OptionMap.create(Options.WORKER_TASK_CORE_THREADS, THREAD_POOL_SIZE, Options.WORKER_TASK_MAX_THREADS, THREAD_POOL_SIZE));
        clientReg = clientEndpoint.addConnectionProvider(<font color="red">"remote"</font>, <font color="navy"><b>new</b></font> RemoteConnectionProviderFactory(), OptionMap.create(Options.SSL_ENABLED, Boolean.FALSE));
        conn = clientEndpoint.connect(<font color="red">"remote"</font>, <font color="navy"><b>new</b></font> InetSocketAddress(<font color="red">"localhost"</font>, 0), <font color="navy"><b>new</b></font> InetSocketAddress(<font color="red">"localhost"</font>, 30123), OptionMap.EMPTY, <font color="red">"bob"</font>, <font color="red">"test"</font>, <font color="red">"pass"</font>.toCharArray()).get();
        System.out.println(<font color="red">"Connection created, "</font> + conn.getEndpoint().getName());
        send();
    <font color="navy">}</font>
 
 
    <font color="navy"><b>private</b></font> <font color="navy"><b>void</b></font> send() <font color="navy">{</font>
        System.out.println(<font color="red">"enter 'quit' or 'exit' exit the ChatDemo"</font>);
 
        BufferedReader in = <font color="navy"><b>new</b></font> BufferedReader(<font color="navy"><b>new</b></font> InputStreamReader(System.in));
 
        <font color="navy"><b>while</b></font> (<font color="navy"><b>true</b></font>) <font color="navy">{</font>
            <font color="navy"><b>try</b></font> <font color="navy">{</font>
                String line = in.readLine().toLowerCase();
                <font color="navy"><b>if</b></font> (line.startsWith(<font color="red">"quit"</font>) || line.startsWith(<font color="red">"exit"</font>)) <font color="navy">{</font>
                    <font color="navy"><b>break</b></font>;
                <font color="navy">}</font>
 
                MessageOutputStream stream = <font color="navy"><b>null</b></font>;
                Channel channel = <font color="navy"><b>null</b></font>;
 
                <font color="navy"><b>try</b></font> <font color="navy">{</font>
                    <font color="navy"><b>final</b></font> IoFuture<Channel> future = conn.openChannel(<font color="red">"test"</font>, OptionMap.EMPTY);
                    channel = future.get();
                    stream = channel.writeMessage();
                    stream.write(<font color="navy"><b>new</b></font> String(line.getBytes(), <font color="red">"UTF-8"</font>).getBytes());
                <font color="navy">}</font> <font color="navy"><b>catch</b></font> (Exception e) <font color="navy">{</font>
                    <font color="navy"><b>throw</b></font> <font color="navy"><b>new</b></font> RuntimeException(<font color="red">"send char sequence error"</font>, e);
                <font color="navy">}</font> <font color="navy"><b>finally</b></font> <font color="navy">{</font>
                    stream.close();
                    IoUtils.safeClose(channel);
                <font color="navy">}</font>
 
            <font color="navy">}</font> <font color="navy"><b>catch</b></font> (Exception e) <font color="navy">{</font>
                <font color="navy"><b>throw</b></font> <font color="navy"><b>new</b></font> RuntimeException(<font color="red">"send char sequence error"</font>, e);
            <font color="navy">}</font>
        <font color="navy">}</font>
 
        IoUtils.safeClose(clientReg);
        IoUtils.safeClose(clientEndpoint);
    <font color="navy">}</font>
 
 
    <font color="navy"><b>public</b></font> <font color="navy"><b>static</b></font> <font color="navy"><b>void</b></font> main(String[] args) <font color="navy"><b>throws</b></font> IOException <font color="navy">{</font>
        <font color="navy"><b>new</b></font> CharSequenceSender();
    <font color="navy">}</font>
 
<font color="navy">}</font>
</code></pre><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p>Source code in github <a class="jive-link-external-small" href="https://github.com/kylinsoong/JVM/tree/master/remoting/testhttp://">https://github.com/kylinsoong</a></p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><p><span style="font-size: 12pt;"><strong>Run and Test</strong></span></p><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><ul><li style="text-align: start;">Clone Source code from github, or download Source code from attachment, use maven build:</li></ul><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><pre class="jive-pre"><code class="jive-code jive-java">mvn clean install dependency:copy-dependencies
</code></pre><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><ul><li style="text-align: start;">Start CharSequenceReceiver</li></ul><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><pre class="jive-pre"><code class="jive-code jive-java">java -cp target/dependency<font color="darkgreen">/*:target/jboss-remoting-test.jar org.jboss.remoting3.sample.CharSequenceReceiver
</font></code></pre><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><ul><li style="text-align: start;">Start CharSequenceSender</li></ul><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><pre class="jive-pre"><code class="jive-code jive-java">java -cp target/dependency<font color="darkgreen">/*:target/jboss-remoting-test.jar org.jboss.remoting3.sample.CharSequenceSender
</font></code></pre><p style="min-height: 8pt; height: 8pt; padding: 0px;"> </p><ul><li style="text-align: start;">Type char sequence in client side as below:</li></ul><p style="text-align: start;"><a href="https://community.jboss.org/servlet/JiveServlet/showImage/21316/VM-remoting-test-client.png"><span> https://community.jboss.org/servlet/JiveServlet/downloadImage/21316/VM-remoting-test-client.png </span></a></p><ul><li style="text-align: start;">Check From Server side 3 char sequence be received by server</li></ul></div>
<div style="background-color: #f4f4f4; padding: 10px; margin-top: 20px;">
<p style="margin: 0;">Comment by <a href="https://community.jboss.org/docs/DOC-51182">going to Community</a></p>
        <p style="margin: 0;">Create a new document in JBoss Remoting Development at <a href="https://community.jboss.org/choose-container!input.jspa?contentType=102&containerType=14&container=2051">Community</a></p>
</div></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>