我是使用MINA的新手。 我有一个使用MINA NIOconnector连接到主机的程序。 我能够发送数据并接收。从log4j日志中可以清楚地看到,我将在下面附上。
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
虽然我在日志中看到“RECEIVED”但我的处理程序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 ");
}
}
答案 0 :(得分:2)
我无法从包含的日志中看出,但TextLineCodecFactory创建的TextLineDecoder将查找(默认情况下)'\ n'(0x0d)或'\ n'(0x0a)以结束该行并生成已完成的消息由您的IoHandlerAdapter处理。传入数据是否正确终止?
答案 1 :(得分:2)
今天我第一次在MINA工作,我发现的严酷现实是很难找到MINA的帮助。即使是自己的网站也几乎没有它。在我收集的一些信息的帮助下,包括你的信息,并在提供的文档的帮助下,我设法连接,发送和接收来自服务器的响应。但令我惊讶的是,没有调用messageReceived(..)方法,只是日志记录证明我收到了所需的响应。日志消息采用unicode(十六进制值)。什么出错都没有例外或任何迹象。我搜索了它。然后我浏览了TextLineCodecFactory的源代码,看起来也很好。我查看了服务器代码,发现他们使用的是自定义编解码器。所以在我看来你的问题和我遇到的一样。确保双方的编解码器相同或至少执行相同的转换。
答案 2 :(得分:0)
它与编解码器工厂有关。我改为自定义编解码器,因为我们在项目中有自定义消息格式。感谢大家的回复。