Showing posts with label packets mina. Show all posts
Showing posts with label packets mina. Show all posts

Tuesday, November 24, 2009

Dancing Packets with Apache Mina

Thanks to some help of some colleague (Marcelo Marmol)Marcelo's Blog, I took my first experience with Apache Mina.
In shorts words this library helps with the transmission of packets, to develop server or client tools.
My first step it's to create a connection between a Tomcat Server and a Java Service (all the info I have). But the code is like this.


*****************CODE**************


import java.net.InetSocketAddress;
import org.apache.mina.core.RuntimeIoException;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.future.ReadFuture;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

import com.ats.example.ClientHandler;

public class ClientTcpIp {

public ClientTcpIp(){

}
//TODO ver diferente mensajes
public String SendMessage(String sMensaje){
String sRespuestaTcp;
IoSession session;
NioSocketConnector connector;
ClientHandler chEventoIO;

//WE CREATE THE CONNECTION (CLIENT SIDE, WITH 3 SECONDS OF TIMEOUT)
connector = new NioSocketConnector();
connector.setConnectTimeoutMillis(30 * 1000L);
//THE HANDLER TO DO SOMETHING WITH THE EVENTS
chEventoIO = new ClientHandler();
chEventoIO.setMensaje("Hi my server, how are you?");
connector.setHandler(chEventoIO);
//THE CODING TO CONNECT WITH THE SERVER, IN THIS CASE STRING
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));
sRespuestaTcp=null;

//TRY TO CONNECT
for (;;) {
try {
//SETTING THE IP AND PORT (EXAMPLE TO LOCALHOST AND PORT 555)
ConnectFuture future = connector.connect(new InetSocketAddress("127.0.0.1",5555));

//BECAUSE THIS IS SYNC, NO ASYNC WE MUST USE THIS
session.getConfig().setUseReadOperation(true);
ReadFuture read =session.read();
//AND WE WAIT THE MESSAGE FROM SERVER OR FIVE SECONDS
if (read.await(5000)){
//WE GET THE MESSAGE FROM THE SERVER
sRespuestaTcp=(String)read.getMessage();
// WE LEAVE THE FOR
break;
}
//IF FIVE SECONDS PASS WE CONNECT AGAIN
} catch (RuntimeIoException e) {
//System.err.println("Failed to connect.");
e.printStackTrace();
try {
// WE WAIT 5 TO TRY AGAIN
Thread.sleep(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//IF EVERYTHING IS OK, WE RETURN THE STRING
return sRespuestaTcp;
}
}


import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.logging.LoggingFilter;

public class ClientHandler extends IoHandlerAdapter {

private String sMensaje;

public ClientHandler(){
setMensaje("");
}
@Override
public void sessionOpened(IoSession session) throws Exception {
if (getMensaje()==""){
session.close(true).awaitUninterruptibly();
throw new Exception("YOU MUST DEFINE A MESSAGE");
}
session.write(getMensaje());
}

@Override
public void sessionClosed(IoSession session) {

}

@Override
public void messageReceived(IoSession session, Object message) {


}

@Override
public void messageSent(IoSession session, Object message) {

}

@Override
public void exceptionCaught(IoSession session, Throwable cause) {
session.close(true);
}

public void setMensaje(String sMensaje) {
this.sMensaje = sMensaje;
}

public String getMensaje() {
return sMensaje;
}
}


************END CODE *****************

Basically, we connect to the server in very simple and few lines with the all mighty and open source mina. This is a not working example, that why is very commented it's only to show how it works, if you want one, leave a comment.
BG