doukk
doukk
2012-04-24 17:57
浏览 233
已采纳

Mina客户端问题

Mina客户端问题

服务端是 C 写,客户端使用 Main

[code="java"]
public class MainClient {

/**
 * @param args
 * @throws InterruptedException 
 */
public static void main(String[] args) throws InterruptedException {
    //创建 tcp/ip 连接
    NioSocketConnector connector = new NioSocketConnector();

    //创建接收数据的过滤器
    DefaultIoFilterChainBuilder chin = connector.getFilterChain();

    //设定这个过滤器将一行一行的读取数据
    chin.addLast("mychin", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));

    //设定客户端消息处理器
    connector.setHandler(new SamplMinaClientHandler());
    //设置连接超时时间
    connector.setConnectTimeout(30);

    //连接到服务器
    ConnectFuture future = connector.connect(new InetSocketAddress("192.168.2.201",31024));

    future.awaitUninterruptibly();
    future.getSession().getCloseFuture().awaitUninterruptibly();
    connector.dispose();
}

}
[/code]

客户端处理器 SamplMinaClientHandler

[code="java"]
public class SamplMinaClientHandler extends IoHandlerAdapter {
//当客户端连接进入时
@Override
public void sessionOpened(IoSession session) throws Exception {

    System.out.println("incomming 客户端: "+session.getRemoteAddress());

    byte[] param = new byte[]{(byte)4,(byte)1,(byte)5};
    IoBuffer io = IoBuffer.wrap(getA(param));
    session.write(io);
}

//当客户端发送消息到达时
@Override
public void messageReceived(IoSession session, Object message)
        throws Exception {

    IoBuffer by = (IoBuffer)message;
    byte[] b = new byte[by.limit()]; 
    by.get(b);

    System.out.println("服务器返回的数据:"+new String(b));
}

}
[/code]

问题: byte数组发送出去了 从TCP监控软件可以看到发出去的报文及返回的数据,为什么客户端接收不到 一直处于阻塞状态?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • iteye_13371
    iteye_13371 2012-04-27 18:47
    已采纳

    看一下mina自带的文档吧,有编码器解码器的例子,例如上面那个TextLineCodecFactory的源代码

    点赞 评论
  • iteye_13371
    iteye_13371 2012-04-25 10:29

    你用的过滤器需要用换行来分割消息,你的消息末尾加换行符了吗

    点赞 评论
  • weixin_42518082
    weixin_42518082 2012-04-25 16:09

    需要自己写ProtocolCodecFactory的哦.
    TextLineCodecFactory是用来处理文本[以\r\n结尾]的..

    点赞 评论
  • iteye_13371
    iteye_13371 2012-04-26 16:26

    没有换行符当然不正确了,你研究一下TextLineCodecFactory那个类,是用换行符作为消息结尾的(或许是回车加换行,记不清了),如果没有换行符,它就认为一条消息没有发完,所以一直在等服务器端把消息发完。
    你现在服务器端和客户端的协议都不一致,总要改一端,如果改客户端,就不要用那个过滤器,自己写一个或换一个,如果改服务器端,就要每条消息单独一行。

    点赞 评论
  • tianlovv
    tianlovv 2012-04-30 21:43

    实现MessageDecoder接口,重写decodable和decode方法

    点赞 评论

相关推荐