`
xiaodongdong
  • 浏览: 80470 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论
阅读更多

 终于是意识到了不写技术博客以及在学完某一样东西而不去练习加以巩固的坏处了!

  这些天在开发山寨QQ,所以想用JAVA里面的mina框架,可是自己压根就没怎么练习用过而且也没做什么笔记,于是开始在Google上大肆搜查,终于算是弄得差不多了,所以得写篇博客,免得以后再找……

  一.mina框架简介

Apache MINA(Multipurpose Infrastructure for Network Applications) Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。

二.Mina的通信模式

由于我是使用的是对象的传送;所以这里只列对象传送



 

 .如何使用

  1.下载mina压缩包,大家可以在http://mina.apache.org下载mina;现在最新的版本是2.0

  2.将里面的jar包导入工程;

  3.做完了这两步还不能用,如果我们写好程序启动之后会报以下错误: 

 

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".

SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder

    at org.slf4j.LoggerFactory.<clinit>(LoggerFactory.java:60)

    at org.apache.mina.core.service.SimpleIoProcessorPool.<clinit>(SimpleIoProcessorPool.java:81)

    at org.apache.mina.core.polling.AbstractPollingIoAcceptor.<init>(AbstractPollingIoAcceptor.java:104)

    at org.apache.mina.transport.socket.nio.NioSocketAcceptor.<init>(NioSocketAcceptor.java:66)

    at minaserver.MinaServer.main(MinaServer.java:19)

Caused by: java.lang.ClassNotFoundException: org.slf4j.impl.StaticLoggerBinder

    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

    at java.security.AccessController.doPrivileged(Native Method)

    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)

    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)

    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)

    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

    ... 5 more

很明显是找不到org/slf4j/impl/StaticLoggerBinder 这个类,那么就需要我们再引入一个jar,所以还需另外下载slf4j-nop-1.5.2.jar引入到工程中才行。

4.当一切工作做好了之后就可以写我们的mina服务器和客户端了

服务器端JAVA源码:

MinaServer:

 

import java.net.InetSocketAddress;

 

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;

import org.apache.mina.filter.codec.ProtocolCodecFilter;

import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;

import org.apache.mina.filter.codec.textline.TextLineCodecFactory;

import org.apache.mina.transport.socket.SocketAcceptor;

import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

 

/**

 * 基于Mina框架的服务器

 * @author :张立冬

 */

public class MinaServer {

 

    public static void main(String[] args) throws Exception{

       //创建一个非阻塞的Server端Socket,用NIO

        SocketAcceptor acceptor = new NioSocketAcceptor();

        //创建接收数据的过滤器

        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();

        //设定这个过滤器将以对象为单位读取数据

        ProtocolCodecFilter filter=   new ProtocolCodecFilter(new ObjectSerializationCodecFactory());

        chain.addLast("objectFilter",filter);

        //设定服务器端的消息处理器:一个SamplMinaServerHandler对象,

        acceptor.setHandler(new ServerIOListener());

         //  服务器端绑定的端口

        

        int bindPort=9988;

        //绑定端口,启动服务器

        acceptor.bind(new InetSocketAddress(bindPort));

        System.out.println("Mina Server is Listing on:= " + bindPort);

 

 

    }

}
 

ServerIOListener:

 

import java.util.ArrayList;

import java.util.List;

 

import org.apache.mina.core.service.IoHandlerAdapter;

import org.apache.mina.core.session.IoSession;

/**

 * 基于Mina框架的通信 服务器端的通信事件监听器

 * 1.完成了通信消息的处理逻辑

 * @author:张立冬

 */

public class ServerIOListener extends IoHandlerAdapter{

    //保存与客户端的会话队列对象

    private List<IoSession> sessions=new ArrayList();

    

    

    public void sessionCreated(IoSession session) throws Exception {

       System.out.println("连结己创建!");

    }

 

    public void sessionOpened(IoSession session) throws Exception {

     //将新会话对象加入队列

    sessions.add(session);

    System.out.println("连结己打开!:");

    this.SendMsg(session);

    }

 

    public void sessionClosed(IoSession session) throws Exception {

    System.out.println("连结己关闭!:");

    }

    

    public void SendMsg(IoSession session) throws Exception{

//      User user=new User();

//      user.setUserID(4);

//      user.setUserName("服务器");

//      session.write(user);

    }

    

    // 发送消息给服务器   

    public void messageSent(IoSession session,Object message) throws Exception { 

    

        System.out.println("服务器端发过去的是:"+message.toString());   

    }   

  

    

    public void messageReceived(IoSession session, Object message)

    throws Exception {

//      String msg=message.toString()+"\r\n";

//      if(msg.equals("bye")){

//          //从队列中找出session,然后close掉即可!

//      }

//      

//      //要发给其它所有用户去

//      for(IoSession otherSession:sessions){

//          if(session.getId()!=otherSession.getId()){

//          otherSession.write(msg);

//          }

//      }

//      

//      User user=(User)message;

//      

//      System.out.println("收到消息: "+user.toString());

   }  

    

}

 
 

客户端JAVA源码:

MinaClient:

 

import java.net.InetSocketAddress;   
import org.apache.commons.logging.Log;   
import org.apache.commons.logging.LogFactory;   
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;   
import org.apache.mina.core.future.ConnectFuture;   
import org.apache.mina.filter.codec.ProtocolCodecFilter;   
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;   
import org.apache.mina.transport.socket.nio.NioSocketConnector;   
    
public class MinaClient {   
    private static final Log log = LogFactory.getLog(MinaClient.class);   
    /**  
     * @param args  
     */  
    public static void main(String[] args) {   
          //实际应用中,这里可以生成一个线程来监听                
        // Create TCP/IP connector.     
        NioSocketConnector connector = new NioSocketConnector();     
             
        // 创建接收数据的过滤器            
        DefaultIoFilterChainBuilder chain = connector.getFilterChain();     
             
        //设定这个过滤器将以对象为单位读取数据
        ProtocolCodecFilter filter=   new ProtocolCodecFilter(new ObjectSerializationCodecFactory());
        chain.addLast("objectFilter",filter);
     
        ClientHandler hand=new ClientHandler();
        
        //设定服务器端的消息处理器:一个SamplMinaServerHandler对象,           
        connector.setHandler(hand);     
        
             
        //连结到服务器:     
        try     
        {     
            ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 9988));    
            cf.awaitUninterruptibly();  
           cf.getSession().getCloseFuture().awaitUninterruptibly();    
            connector.broadcast("ddfdf");   
        }     
        catch(Exception e)     
        {     
            connector.dispose();     
            log.error("未能连接到服务器");     
        }     
  
    }
}

 .类ClientHandler

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
  
public class ClientHandler extends IoHandlerAdapter throws IOException{   
    // 当一个客端端连结进入时   
    private static final Log log = LogFactory   
            .getLog(ClientHandler.class);   
  
    public void sessionOpened(IoSession session) throws Exception {   
        log.info("server  : " + session.getRemoteAddress()); 
//        try {
//			this.SendMsg(session);
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
    }   
  
    // 当一个客户端关闭时   
    public void sessionClosed(IoSession session) {   
        log.info("one server  Disconnect !");   
    }   
  
    // 当服务器端发送的消息到达时:   
    public void messageReceived(IoSession session, Object message)   
            throws Exception {   
        User user = (User) message;   
        System.out.println("接收到服务器发过来的用户对象是:"+user.toString());   
    }   
  
    // 发送消息给服务器   
    public void messageSent(IoSession session,Object message) throws Exception { 
    	
        System.out.println("客户端发过去的是:"+message.toString());   
    }   
  
    // 发送消息异常   
    public void exceptionCaught(IoSession session, Throwable cause) {   
        session.close();   
    }   
    
    public void SendMsg(IoSession session) throws Exception{
    	User user=new User();
    	user.setUserID(1);
    	user.setUserName("张立冬");
    	session.write(user);	
    }
  
    // //sessiong空闲   
    // public void sessionIdle( IoSession session, IdleStatus status )   
    // {   
    // }   
    // 创建 session   
    public void sessionCreated(IoSession session) {   
         
    }   
}  

 

 

  • 大小: 31.7 KB
  • src.rar (2.2 MB)
  • 下载次数: 203
0
0
分享到:
评论
5 楼 beckergrape 2010-08-25  
xiaodongdong 写道
你好,请问服务端的“//要发给其它所有用户去”部分是如何实现的,现在我就遇到这个问题,哎。
beckergrape 写道
你好,请问服务端的“//要发给其它所有用户去”部分是如何实现的,现在我就遇到这个问题,哎。

获取其他用户的session;并对这个session进行操作不就可以了么?


反应迅速  我目前的情况就和博主的项目差不多:mina服务端获得一个客户端发送的控制码,经过逻辑处理,再将处理后的信息分发给其他客户端。主要是刚刚接触mina,有想法,可实现起来磕磕碰碰,想请教下博主在实际应用中是如何处理的呢?
4 楼 xiaodongdong 2010-08-24  
你好,请问服务端的“//要发给其它所有用户去”部分是如何实现的,现在我就遇到这个问题,哎。
beckergrape 写道
你好,请问服务端的“//要发给其它所有用户去”部分是如何实现的,现在我就遇到这个问题,哎。

获取其他用户的session;并对这个session进行操作不就可以了么?
3 楼 beckergrape 2010-08-24  
你好,请问服务端的“//要发给其它所有用户去”部分是如何实现的,现在我就遇到这个问题,哎。
2 楼 xiaodongdong 2010-07-31  
不好意思;之前出点问题;所以没有能发完
1 楼 chb_it 2010-06-02  
   咋没发完啊?

相关推荐

    niosocket及其开源框架MINA学习总结收集.pdf

    niosocket及其开源框架MINA学习总结收集.pdf

    mina学习总结

    NULL 博文链接:https://blueram.iteye.com/blog/1608421

    MINA学习资料大全

    MINA开发文档总结,有如下内容Apache_Mina_Server_2.0中文参考手册V1.0.pdf 深入理解Apache_Mina.pdf MINA2官方教程翻译.pdf Mina2源码分析.pdf

    Java学习之IO总结及mina和netty

    NULL 博文链接:https://410063005.iteye.com/blog/1724491

    Netty权威指南(第2版)

    《Netty 权威指南(第2 版)》是异步非阻塞通信领域的经典之作,基于最新版本的Netty 5.0 编写,是国内首本深入介绍Netty 原理和架构的书籍,也是作者多年实战经验的总结和浓缩。内容不仅包含Java NIO入门知识、...

    Netty权威指南 第2版 带书签目录

    《Netty 权威指南(第2 版)》是异步非阻塞通信领域的经典之作,基于最新版本的Netty 5.0 编写,是国内首本深入介绍Netty 原理和架构的书籍,也是作者多年实战经验的总结和浓缩。内容不仅包含Java NIO入门知识、...

    【helloworld】-微信小程序教程-入门篇【6】

    本节目标:对于入门篇的总结 目标用户:无编程经验,但对微信小程序感兴趣的同学。 学习目标:对微信小程序的研发,有概要的了解,并对基本知识点有一定的认识,不需要深入追究。仅记80/20定律。 案例分析:hello...

    travelibrary-微信小程序实战-流动图书馆.zip

    预览链接技术栈小程序MINA框架: 一个响应的数据绑定框架。分为两块视图层(View)和逻辑层(App Service)Flex:flex弹性布局Express : http服务框架websocket: 前后端消息的实时推送mongoose: 操作mongodb数据库pm2: ...

Global site tag (gtag.js) - Google Analytics