2010-04-29 4 views
2

Je suis novice dans l'utilisation de MINA. J'ai un programme qui utilise MINA NIOconnector pour se connecter à l'hôte. Je suis en mesure d'envoyer des données et également recevoir. Cela est clair à partir du journal log4j que je joins ci-dessous.Aide du connecteur Apache MINA NIO

E:\>java TC4HostClient 
[12:21:46] NioProcessor-1 INFO [] [] [org.apache.mina.filter.logging.LoggingFil 
ter] - CREATED 
[12:21:46] NioProcessor-1 INFO [] [] [org.apache.mina.filter.logging.LoggingFil 
ter] - OPENED 
Opened 
CGS Sign On 
[12:21:46] NioProcessor-1 INFO [] [] [org.apache.mina.filter.logging.LoggingFil 
ter] - SENT: HeapBuffer[pos=0 lim=370 cap=512: 20 20 20 20 20 20 20 20 20 20 20 
20 20 20 20 20...] 
[12:21:46] NioProcessor-1 INFO [] [] [org.apache.mina.filter.logging.LoggingFil 
ter] - SENT: HeapBuffer[pos=0 lim=0 cap=0: empty] 
Message Sent    00000333CST 1001010  00000308000003080010000 
000009600000000FTS O00000146TC4DS  001WSJTC41 ---001NTMU9001-I  --- 
-----000      0030000000012400000096500007013082015SATYA 500000 
       010165070000002200011 
       01800000000022000001241 172.16.25.122 02 
[12:21:46] NioProcessor-1 INFO [] [] [org.apache.mina.filter.logging.LoggingFil 
ter] - RECEIVED: HeapBuffer[pos=0 lim=36 cap=2048: 20 20 20 20 20 20 20 20 20 20 
20 20 20 20 20 20...] 
[12:21:46] NioProcessor-1 INFO [] [] [org.apache.mina.filter.logging.LoggingFil 
ter] - RECEIVED: HeapBuffer[pos=0 lim=505 cap=2048: 31 20 20 20 20 20 20 20 20 3 
0 30 30 30 30 34 38...] 
After Writing 
[12:21:52] NioProcessor-1 INFO [] [] [org.apache.mina.filter.logging.LoggingFil 
ter] - CLOSED 

Bien que je vois « Received » dans le journal de mon gestionnaire méthode MessageReceived n'est pas appelé. Quelqu'un peut-il me aider s'il vous plaît à cet égard et dites-moi ce que je fais mal

import java.io.IOException; 
import java.net.InetSocketAddress; 
import java.nio.charset.Charset; 
import java.net.SocketAddress; 

import org.apache.mina.core.service.IoAcceptor; 
import org.apache.mina.core.session.IdleStatus; 
import org.apache.mina.filter.codec.ProtocolCodecFilter; 
import org.apache.mina.filter.codec.textline.TextLineCodecFactory; 
import org.apache.mina.filter.logging.LoggingFilter; 
import org.apache.mina.transport.socket.nio.NioSocketConnector; 
import org.apache.mina.core.session.IoSession; 
import org.apache.mina.core.future.*; 

public class TC4HostClient 
{ 
    private static final int PORT = 9123; 

    public static void main(String[] args) throws IOException,Exception 
    { 
     NioSocketConnector connector = new NioSocketConnector(); 
     SocketAddress address = new InetSocketAddress("172.16.25.3", 8004); 
     connector.getSessionConfig().setReadBufferSize(2048); 

     connector.getFilterChain().addLast("logger", new LoggingFilter()); 
     connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8")))); 

     connector.setHandler(new TC4HostClientHandler()); 
     ConnectFuture future1 = connector.connect(address); 

     future1.awaitUninterruptibly(); 

     if (!future1.isConnected()) { 
      return ; 
     } 
     IoSession session = future1.getSession(); 


     System.out.println("CGS Sign On"); 
     session.getConfig().setUseReadOperation(true); 
     session.write("    00000333CST 1001010  00000308000003080010000000009600000000FTS O00000146TC4DS  001WSJTC41 ---001NTMU9001-I  --------000      0030000000012400000096500007013082015SATYA 500000    010165070000002200011                01800000000022000001241 172.16.25.122 02"); 

     session.getCloseFuture().awaitUninterruptibly(); 

     System.out.println("After Writing"); 
     connector.dispose(); 





    } 
} 

import org.apache.mina.core.session.IdleStatus; 
import org.apache.mina.core.service.IoHandlerAdapter; 
import org.apache.mina.core.session.IoSession; 
import org.apache.mina.core.buffer.IoBuffer; 

public class TC4HostClientHandler extends IoHandlerAdapter 
{ 
    @Override 
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception 
    { 
     cause.printStackTrace(); 
    } 
    @Override 
    public void messageSent(IoSession session, Object message) throws Exception 
    { 
     String str = message.toString(); 
     System.out.println("Message Sent" + str); 
    } 

    @Override 
    public void messageReceived(IoSession session, Object message) throws Exception 
    { 
     IoBuffer buf = (IoBuffer) message; 
     // Print out read buffer content. 
     while (buf.hasRemaining()) { 
      System.out.print((char) buf.get()); 
     } 
     System.out.flush(); 

    } 
    /* 
    @Override 
    public void messageReceived(IoSession session, Object message) throws Exception 
    { 
     String str = message.toString(); 
     System.out.println("Message Received : " + str); 
    }*/ 

    @Override 
    public void sessionIdle(IoSession session, IdleStatus status) throws Exception 
    { 
     System.out.println("IDLE " + session.getIdleCount(status)); 
    } 

    public void sessionClosed(IoSession session){ 
     System.out.println("Closed "); 
    } 
    public void sessionOpened(IoSession session){ 
     System.out.println("Opened "); 
    } 
} 

Répondre

1

Je ne peux pas dire de vos journaux inclus, mais le TextLineDecoder créé par TextLineCodecFactory sera à la recherche pour (par défaut) un '\ r' (0x0d) ou '\ n' (0x0a) pour terminer la ligne et générer le message terminé à traiter par votre IoHandlerAdapter. Les données entrantes sont-elles correctement terminées?

+0

Merci pour la réponse. Il m'a vraiment aidé beaucoup .. j'ai changé en codec personnalisé et cela a très bien fonctionné .. – satya

2

Aujourd'hui j'ai travaillé pour la première fois sur MINA et la dure réalité que j'ai trouvée est que l'aide sur MINA est difficile à trouver. Même son propre site est presque sans. Avec l'aide de quelques informations que j'ai réussi à rassembler, y compris le vôtre et avec l'aide de la documentation fournie, j'ai réussi à me connecter, envoyer et recevoir la réponse du serveur. Mais à ma grande surprise, la méthode messageReceived (..) n'a pas été appelée, seulement l'enregistrement a prouvé que j'ai reçu la réponse requise. Le message du journal était en Unicode (valeur hexadécimale). Il n'y avait pas d'exception ou d'indication sur ce qui s'est mal passé. Je l'ai cherché. Ensuite, je suis allé à travers la source de TextLineCodecFactory et il semblait bien aussi. J'ai parcouru le code du serveur et j'ai découvert qu'ils utilisaient un codec personnalisé. Donc, à mon avis, votre problème est le même que j'ai rencontré. Assurez-vous que le codec des deux côtés est identique ou effectue au moins les mêmes conversions.

+0

Salut neo, Appréciez votre réponse à cet égard. Comme vous l'avez mentionné, il est lié à l'usine de codec. Je suis passé en codec personnalisé car nous avons des formats de messages personnalisés dans le projet. merci pour votre réponse – satya

0

Il est lié à la fabrique de codec. Je suis passé au codec personnalisé car nous avons des formats de messages personnalisés dans le projet .. merci à tous pour vos réponses.