2010-04-29 72 views
2

我是使用MINA的新手。 我有一个使用MINA NIOconnector连接主机的程序。 我可以发送数据,也可以接收。这从我附在下面的log4j日志中是清楚的。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 

虽然我见“获得”登录我的处理程序的messageReceived方法不会被调用。 任何人都可以请帮我在这方面,并告诉我,我做错了

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 "); 
    } 
} 

回答

1

我无法从你的日志中包含的诉说,而是由TextLineCodecFactory创建的TextLineDecoder将寻找对于(默认情况下)'\ r'(0x0d)或'\ n'(0x0a)来结束这一行并生成完整的消息以供IoHandlerAdapter处理。传入的数据是否正确终止?

+0

感谢您的回复。它真的帮了我很多..我改变了自定义编解码器,它工作得很好.. – satya 2010-07-16 07:33:37

2

今天我第一次在MINA工作,我发现的残酷现实是MINA的帮助很难找到。即使它自己的网站几乎没有它。在我设法收集的几条信息的帮助下,包括你的信息以及我提供的文档帮助我设法连接,发送和接收来自服务器的响应。但令我惊讶的是messageReceived(..)方法没有被调用,只是日志记录证明我收到了所需的响应。日志消息是unicode(十六进制值)。没有任何异常或任何迹象表明出了什么问题。我搜索了它。然后我浏览了TextLineCodecFactory的源码,它看起来也很好。我浏览了服务器代码,发现他们正在使用自定义编解码器。所以我认为你的问题和我遇到的一样。确保双方的编解码器相同或至少执行相同的转换。

+0

嗨, 欣赏你在这方面的答复。如您所说,它与编解码器工厂有关。我更改为自定义编解码器,因为我们在项目中有自定义消息格式。 感谢您的回复 – satya 2010-07-16 07:34:14

0

它与编解码器工厂有关。我更改为自定义编解码器,因为我们在项目中拥有自定义消息格式。谢谢大家的回复。