vagrant1984
vagrant1984
2009-07-14 09:25
浏览 211
已采纳

mina可能作为服务端,只负责发送数据?

客户端连接上之后,不需要发送信息,而是服务端直接将信息发送至客户端,是否可行?? 另外,怎样将已经处理好的数据加入到mina服务端发送,现在好像只能是messageReceived触发操作
[b]问题补充:[/b]
通过public void sessionOpened(IoSession session) throws Exception方法实现。

怎样将记录传递到open方法呢,我以前试过,但是报错
[b]问题补充:[/b]
[code="java"]
public class ChatProtocolHandler extends IoHandlerAdapter {
private Queue msgQueue = new ConcurrentLinkedQueue();
public void sessionOpened(IoSession session) throws Exception {
while (true) {
int size = msgQueue.size();
for (int i = 0; i < size; i++) {
byte[] b = msgQueue.poll();
if (b == null) continue;
session.write(b);
}
}
}

public void add(byte[] args) {
    msgQueue.add(args);
}

}
[/code]

在其他应用中将数据通过add方法,加入到msgQueue中,但是一两个客户端连接时,cpu就飙高到100了,该怎么处理??

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

3条回答 默认 最新

  • numenZQ
    numenZQ 2009-07-14 10:30
    已采纳

    在服务端的Handler继承IoHandlerAdapter,
    http://mina.apache.org/report/trunk/apidocs/

    通过public void sessionOpened(IoSession session) throws Exception方法实现。

    点赞 评论
  • wanghaolovezlq
    wanghaolovezlq 2009-07-14 11:12

    基于MINA框架快速开发网络应用程序

    1.MINA框架简介
    MINA(Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架。通过使用MINA框架可以可以省下处理底层I/O和线程并发等复杂工作,开发人员能够把更多的精力投入到业务设计和开发当中。MINA框架的应用比较广泛,应用的开源项目有Apache Directory、AsyncWeb、Apache Qpid、QuickFIX/J、Openfire、SubEthaSTMP、red5等。MINA框架当前稳定版本是1.1.6,最新的2.0版本目前已经发布了M1版本。
    MINA框架的特点有:基于java NIO类库开发;采用非阻塞方式的异步传输;事件驱动;支持批量数据传输;支持TCP、UDP协议;控制反转的设计模式(支持Spring);采用优雅的松耦合架构;可灵活的加载过滤器机制;单元测试更容易实现;可自定义线程的数量,以提高运行于多处理器上的性能;采用回调的方式完成调用,线程的使用更容易。

    2.MINA框架的常用类
    类NioSocketAcceptor用于创建服务端监听;
    类NioSocketConnector用于创建客户端连接;
    类IoSession用来保存会话属性和发送消息;
    类IoHandlerAdapter用于定义业务逻辑,常用的方法有:
    方法 定义
    sessionCreated() 当会话创建时被触发
    sessionOpened() 当会话开始时被触发
    sessionClosed() 当会话关闭时被触发
    sessionIdle() 当会话空闲时被触发
    exceptionCaught() 当接口中其他方法抛出异常未被捕获时触发此方法
    messageRecieved() 当接收到消息后被触发
    messageSent() 当发送消息后被触发

    3.服务端应用开发示例
    下面将以MINA2.0M1版本为基础,通过一个范例来演示一下如何使用MINA框架进行开发。开发环境为jdk6.0,开发工具NetBeans6.0,所需jar包slf4j-api.jar、slf4j-jdk14.jar、MINA-core-2.0.0-M1.jar。
    首先定义一个业务逻辑处理器TimeServerHandler,继承自IoHandlerAdapter,实现的功能有:当客户端创建会话时会显示客户端设备的IP和端口;当客户端输入quit时结束会话;客户端输入其它内容时则向客户端发送当前时间。代码如下:
    public class TimeServerHandler extends IoHandlerAdapter
    {
    @Override
    public void sessionCreated(IoSession session) {
    //显示客户端的ip和端口
    System.out.println(session.getRemoteAddress().toString());
    }
    @Override
    public void messageReceived( IoSession session, Object message ) throws Exception
    {
    String str = message.toString();
    if( str.trim().equalsIgnoreCase("quit") ) {
    session.close();//结束会话
    return;
    }
    Date date = new Date();
    session.write( date.toString() );//返回当前时间的字符串
    System.out.println("Message written...");
    }
    }
    再定义一个类MinaTimeServer用来启动服务端:
    public class MinaTimeServer
    {
    private static final int PORT = 9123;//定义监听端口
    public static void main( String[] args ) throws IOException
    {
    IoAcceptor acceptor = new NioSocketAcceptor();
    acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
    acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));//指定编码过滤器
    acceptor.setHandler( new TimeServerHandler() );//指定业务逻辑处理器
    acceptor.setDefaultLocalAddress( new InetSocketAddress(PORT) );//设置端口号
    acceptor.bind();//启动监听
    }
    }

    4.测试
    首先运行MinaTimeServer,启动服务端,接着在命令行运行“telnet 127.0.0.1 9123”,来登录,这时会看到服务端输出如下:
    2008-2-21 16:15:29 org.apache.MINA.filter.logging.LogLevel$4 log
    /10.64.2.137:4140 IP和端口号
    信息: CREATED
    2008-2-21 16:15:29 org.apache.MINA.filter.logging.LogLevel$4 log
    信息: OPENED 在客户端输入回车,在客户端可以看到服务端返回当前的时间:
    Thu Feb 21 16:20:14 CST 2008
    服务端输出:
    2008-2-21 16:20:14 org.apache.MINA.filter.logging.LogLevel$4 log
    信息: RECEIVED: HeapBuffer[pos=0 lim=2 cap=2048: 0D 0A] 接收收到回车符
    Message written...
    2008-2-21 16:20:14 org.apache.MINA.filter.logging.LogLevel$4 log
    信息: SENT: HeapBuffer[pos=0 lim=29 cap=30: 54 68 75 20 46 65 62 20 32 31 20 31 36 3A 32 30...]
    2008-2-21 16:20:14 org.apache.MINA.filter.logging.LogLevel$4 log
    信息: SENT: HeapBuffer[pos=0 lim=0 cap=0: empty] 5.客户端开发示例
    首先定义类TimeClientHandler来处理消息接收事件:
    class TimeClientHandler extends IoHandlerAdapter{
    public TimeClientHandler() {
    }
    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
    System.out.println(message);//显示接收到的消息
    }
    }
    接着定义MinaTimeClient类用于连接服务端,并向服务端发送消息:
    public class MinaTimeClient {
    public static void main(String[] args) {
    // 创建客户端连接器.
    NioSocketConnector connector = new NioSocketConnector();
    connector.getFilterChain().addLast( "logger", new LoggingFilter() );
    connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" )))); //设置编码过滤器
    connector.setConnectTimeout(30);
    connector.setHandler(new TimeClientHandler());//设置事件处理器
    ConnectFuture cf = connector.connect(
    new InetSocketAddress("127.0.0.1", 9123));//建立连接
    cf.awaitUninterruptibly();//等待连接创建完成
    cf.getSession().write("hello");//发送消息
    cf.getSession().write("quit");//发送消息
    cf.getSession().getCloseFuture().awaitUninterruptibly();//等待连接断开
    connector.dispose();
    }
    }
    6.总结
    通过上述示例可以了解到:使用MINA框架来开发的网络应用程序代码结构更清晰;MINA框架完成了底层的线程管理;MINA内置的编码器可以满足大多数用户的需求,省去了开发人员消息编码解码的工作。具称使用MINA开发服务器程序的性能已经逼近使用 C/C++ 语言开发的网络服务。因此,建议在网络应用程序开发过程中尝试使用MINA框架来提高我们的开发效率和应用程序的执行效率。

    网通系统集成公司 杨庆成

    点赞 评论
  • numenZQ
    numenZQ 2009-07-14 14:29

    你这样不行,session.write的应该是一个ByteBuffer,应该是这样:

    [code="java"]
    byte[] b = msgQueue.poll();

    ByteBuffer bb = ByteBuffer.allocate(b.length);
    bb.put(b);
    bb.flip();

    session.write(bb);
    [/code]

    另外,关于NIO,我觉得这篇文章不错:
    http://www.ibm.com/developerworks/cn/views/java/tutorials.jsp?cv_doc_id=85062

    点赞 评论

相关推荐