`
xiaodongdong
  • 浏览: 81281 次
  • 性别: 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  
   咋没发完啊?

相关推荐

    mina学习总结

    《Mina学习总结》 Apache Mina(全称Mini Assured Networking Abstraction)是一个轻量级、高性能的网络通信框架,广泛应用于Java平台上的网络应用开发。它为开发者提供了简单的API来处理网络通信,简化了TCP/IP和...

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

    总结来说,NIO 和 MINA 为Java网络编程提供了更高效、更灵活的解决方案。相比于传统的阻塞式socket,NIO降低了系统资源的消耗,MINA则进一步简化了NIO的使用,使得开发者能更专注于应用的业务逻辑。对于需要处理大量...

    MINA学习资料大全

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

    Mina学习资料

    《Mina学习资料》 Apache Mina是一个高度可扩展的网络通信框架,它为开发者提供了构建高性能、高可用性的网络应用程序的基础。Mina的核心理念是将网络通信的复杂性抽象出来,让开发者能够专注于业务逻辑,而不是...

    Mina学习笔记

    Apache Mina是一个基于Java的网络通信框架,专为高性能、高可用性和可扩展性而设计。...在深入学习Mina的过程中,理解IoService及其子类的工作原理,以及如何结合IoHandler实现业务逻辑,对于掌握Mina框架至关重要。

    MIna2.0学习笔记

    1. **下载使用的Jar包**:在开始Mina2.0的学习之前,你需要从Apache官网或其他可靠的源下载Mina的最新版本库。通常,这包括核心库和其他依赖库,如slf4j用于日志记录。 2. **工程创建配置**:创建一个新的Java项目...

    Java学习之IO总结及mina和netty

    这篇博客“Java学习之IO总结及mina和netty”探讨了Java IO的基础知识,并深入到两个高级网络通信框架——Mina和Netty。Mina和Netty都是基于NIO(非阻塞IO)的高性能网络应用框架,它们简化了复杂网络编程的实现。 *...

    mina学习基础-入门实例-传输定长报文(三)

    总结起来,"mina学习基础-入门实例-传输定长报文(三)"主要涵盖了如何使用Apache Mina框架实现定长报文的SSL加密传输。这个过程涉及到了Mina的Server创建、过滤器链构建、编码解码器设计以及事件驱动模型的运用。通过...

    apache mina 学习笔记三(子项目FtpServer)

    在本学习笔记中,我们将专注于MINA的子项目——FtpServer,它是实现FTP服务器功能的一个模块。 FTP(File Transfer Protocol)是一种广泛使用的互联网协议,用于在不同主机之间传输文件。Apache MINA FtpServer提供...

    Mina2.0学习笔记(完整版).doc

    总结** Apache Mina2.0为开发者提供了强大的工具,简化了网络编程的复杂性,使得开发高性能的网络应用变得更加容易。通过深入理解和熟练运用Mina的API和设计模式,开发者可以构建出高效、稳定的网络服务。

    MINA开发手册和JAR包

    总结来说,这个压缩包提供了全面的MINA开发资源,包括必要的库文件和详细的文档,对于想要学习和使用MINA进行网络应用开发的人员来说非常有价值。通过深入阅读手册,理解和实践提供的示例,开发者可以快速掌握MINA的...

    mina连接 mina心跳连接 mina断线重连

    总结起来,Apache Mina提供了一套强大的网络通信框架,通过其心跳连接和断线重连功能,可以确保服务的稳定性和可靠性。对于Android开发者来说,理解和应用这些机制,能够有效提升应用程序的网络通信质量。

    mina

    3. **MINA使用手记[1] .shtml** 和 **MINA框架使用总结 .shtml**:这些可能是个人或团队在使用MINA过程中的笔记和总结,可能包含了实践中的技巧、问题解决策略以及最佳实践。 4. **Apache MINA 线程模型配置 .shtml...

    Java springboot 整合mina 框架,nio通讯基础教程,mina框架基础教程.zip

    总结来说,本教程将引导你从理论到实践,掌握Java NIO的基本原理,理解Mina框架的使用,以及如何在SpringBoot环境中整合Mina实现高效的网络通信。通过这些知识的学习,你将具备开发高并发、高性能网络应用的能力。

Global site tag (gtag.js) - Google Analytics