Salve galera,
A questao é a seguinte turma, preciso desenvolver um servidor onde recebera conexões de equipamentos embarcados. Não estou querendo usar sockets nativos para desenvolver, pesquisei na internet e achei o MINA da Apache.
Minha aplicacao recebe uma String de indentificacao do equipamento assim que o equipamento conecta no servidor.
Quando eu uso a linha abaixo o servidor nao chama o metodo public void messageReceived(IoSession session, Object message) da classe ServerHandler
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
Quando comento a linha acima e rodo o meu servidor o metodo public void messageReceived(IoSession session, Object message) da classe ServerHandler é chamado normalmente, so que o paramatro “messagem” tenho que usar o classe IoBuffer para ler os dados, ate ai blza, mas eu preciso enviar comandos para o equipamento. quando eu faço assim:
session.write("@");
Com essa linha acima, surge o seguinte erro:
Don't know how to handle message of type 'java.lang.String'. Are you missing a protocol encoder?
Como que eu resolvo isso? Alguem ja trabalhou com o MINA? Tem algum outro filtro que eu possa usar no MINA para resolver esse problema de conexao com o meu equipamento?
Abaixo os meus fontes:
Classe ServerHandler
public class ServerHandler extends IoHandlerAdapter {
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
System.out.println(cause.getMessage());
}
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
StringBuilder sb = new StringBuilder();
IoBuffer buffer = (IoBuffer) message;
if (!buffer.hasRemaining()) {
System.out.println("NO bytes to read keep waiting");
}
while (buffer.hasRemaining()) {
sb.append((char) buffer.get());
}
System.out.println(sb.toString());
session.write("@");
}
@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
System.out.println("IDLE " + session.getIdleCount(status));
}
@Override
public void messageSent(IoSession session, Object message) throws Exception {
System.out.println("messageSent");
}
@Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println("sessionCreated");
}
@Override
public void sessionOpened(IoSession session) throws Exception {
System.out.println("sessionOpened");
}
}
Classe ServerMina
public class ServerMina {
private static final int PORT = 8084;
public static void main(String[] args) throws IOException {
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
//acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter2(new TextLineCodecFactory2(Charset.forName("UTF-8"))));
acceptor.setHandler(new SViasServerHandler());
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 1);
acceptor.getSessionConfig().setWriterIdleTime(60);
acceptor.bind(new InetSocketAddress(PORT));
}
}