`
yangghost
  • 浏览: 13377 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

mina2官方例子chat服务器

    博客分类:
  • mina
阅读更多
这是chat服务器里面的main方法入口:
package org.apache.mina.example.chat;

import java.net.InetSocketAddress;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.example.echoserver.ssl.BogusSslContextFactory;
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.filter.logging.MdcInjectionFilter;
import org.apache.mina.filter.ssl.SslFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

/**
 * (<b>Entry point</b>) Chat server
 *
 * @author <a href="http://mina.apache.org">Apache MINA Project</a>
 */
public class Main {
    /** 服务器端口号 */
    private static final int PORT = 1234;

    /** 是否启用ssl */
    private static final boolean USE_SSL = false;

    public static void main(String[] args) throws Exception {
    	//实例化一个NioSocketAcceptor
        NioSocketAcceptor acceptor = new NioSocketAcceptor();
        //获取过滤器链
        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
        //实例化MdcInjectionFilter过滤器,针对日志输出做MDC操作,可以参考log4j的MDC、NDC的文档
        MdcInjectionFilter mdcInjectionFilter = new MdcInjectionFilter();
        //添加MdcInjectionFilter过滤器
        chain.addLast("mdc", mdcInjectionFilter);

        //如果开启ssl,则添加ssl支持过滤链
        if (USE_SSL) {
            addSSLSupport(chain);
        }
        /* 添加TextLine编解码过滤器,将一行以换行符为结束符号的byte[]转换成String对象
         * TextLineCodecFactory有TextLineEncoder编码实现,TextLineDecoder解码实现
        */
        chain.addLast("codec", new ProtocolCodecFilter(
                new TextLineCodecFactory()));
        //添加日志过滤器
        addLogger(chain);

        // 设置handler
        acceptor.setHandler(new ChatProtocolHandler());
        //绑定服务器端口
        acceptor.bind(new InetSocketAddress(PORT));

        System.out.println("Listening on port " + PORT);
    }
    /**
     * 添加ssl支持过滤器
     * @param chain	过滤器链
     * @throws Exception
     */
    private static void addSSLSupport(DefaultIoFilterChainBuilder chain)
            throws Exception {
        SslFilter sslFilter = new SslFilter(BogusSslContextFactory
                .getInstance(true));
        chain.addLast("sslFilter", sslFilter);
        System.out.println("SSL ON");
    }
    /**
     * 添加日志过滤器
     * @param chain	过滤器链
     * @throws Exception
     */
    private static void addLogger(DefaultIoFilterChainBuilder chain)
            throws Exception {
        chain.addLast("logger", new LoggingFilter());
        System.out.println("Logging ON");
    }
}

这是协议命令:
package org.apache.mina.example.chat;

/**
 * Encapsulates a chat command. Use {@link #valueOf(String)} to create an
 * instance given a command string.
 *
 * @author <a href="http://mina.apache.org">Apache MINA Project</a>
 */
public class ChatCommand {
    public static final int LOGIN = 0;//登录

    public static final int QUIT = 1;//退出

    public static final int BROADCAST = 2;//广播

    private final int num;

    private ChatCommand(int num) {
        this.num = num;
    }

    public int toInt() {
        return num;
    }
    
    /*
     * 
     */
    public static ChatCommand valueOf(String s) {
        s = s.toUpperCase();
        if ("LOGIN".equals(s)) {
            return new ChatCommand(LOGIN);
        }
        if ("QUIT".equals(s)) {
            return new ChatCommand(QUIT);
        }
        if ("BROADCAST".equals(s)) {
            return new ChatCommand(BROADCAST);
        }

        throw new IllegalArgumentException("Unrecognized command: " + s);
    }
}

这是chatProtocolhandler
package org.apache.mina.example.chat;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.logging.MdcInjectionFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * {@link IoHandler} implementation of a simple chat server protocol.
 *
 * @author <a href="http://mina.apache.org">Apache MINA Project</a>
 */
public class ChatProtocolHandler extends IoHandlerAdapter {
    private final static Logger LOGGER = LoggerFactory.getLogger(ChatProtocolHandler.class);
    //客户端session Set集合
    private final Set<IoSession> sessions = Collections
            .synchronizedSet(new HashSet<IoSession>());
    //用户 Set集合
    private final Set<String> users = Collections
            .synchronizedSet(new HashSet<String>());
    
    /**
     * 异常处理
     */
    @Override
    public void exceptionCaught(IoSession session, Throwable cause) {
        LOGGER.warn("Unexpected exception.", cause);
        //如果有未捕获的异常则关闭连接
        session.close(true);
    }
    /**
     * 接收信息处理
     */
    @Override
    public void messageReceived(IoSession session, Object message) {
        Logger log = LoggerFactory.getLogger(ChatProtocolHandler.class);
        log.info("received: " + message);
        //转换成String类型
        String theMessage = (String) message;
        //以空格分隔成两半
        String[] result = theMessage.split(" ", 2);
        //前半段是协议命令
        String theCommand = result[0];
        
        try {
        	//转换成协议命令对象
            ChatCommand command = ChatCommand.valueOf(theCommand);
            //从session取得key为user的值
            //取得当前用户
            String user = (String) session.getAttribute("user");
            
            switch (command.toInt()) {
            //退出
            case ChatCommand.QUIT:
                session.write("QUIT OK");
                session.close(true);
                break;
            //登录
            case ChatCommand.LOGIN:
            	//session里有用户已登录
                if (user != null) {
                    session.write("LOGIN ERROR user " + user
                            + " already logged in.");
                    return;
                }
                //取得后半段的用户名
                if (result.length == 2) {
                    user = result[1];
                } else {
                    session.write("LOGIN ERROR invalid login command.");
                    return;
                }

                //该用户已在线
                //if(isChatUser(user)){
                if (users.contains(user)) {
                    session.write("LOGIN ERROR the name " + user
                            + " is already used.");
                    return;
                }
                //将连接添加到sessions集合中统一管理
                sessions.add(session);
                //设置该session的user属性
                session.setAttribute("user", user);
                //edit me
                MdcInjectionFilter.setProperty(session, "user", user);

                //将用户添加users集合中统一管理
                users.add(user);
                //给客户端返回登录成功消息
                session.write("LOGIN OK");
                //通知所有现在用户有新用户登入
                broadcast("The user " + user + " has joined the chat session.");
                break;
                //广播信息
            case ChatCommand.BROADCAST:
            	//取得后半段用户需要广播的信息内容,并广播
                if (result.length == 2) {
                    broadcast(user + ": " + result[1]);
                }
                break;
                //不认识的命令
            default:
                LOGGER.info("Unhandled command: " + command);
                break;
            }

        } catch (IllegalArgumentException e) {
            LOGGER.debug("Illegal argument", e);
        }
    }
    /**
     * 给所有在线用户广播信息
     * @param message 信息内容
     */
    public void broadcast(String message) {
        synchronized (sessions) {
            for (IoSession session : sessions) {
                if (session.isConnected()) {
                    session.write("BROADCAST OK " + message);
                }
            }
        }
    }
    
    /**
     * 连接断开处理
     */
    @Override
    public void sessionClosed(IoSession session) throws Exception {
        String user = (String) session.getAttribute("user");
        //移除用户以及连接,并通知其他在线用户该用户已离开
        users.remove(user);
        sessions.remove(session);
        broadcast("The user " + user + " has left the chat session.");
    }
    
    /**
     * 判断用户是否在线
     * @param name
     * @return
     */
    public boolean isChatUser(String name) {
        return users.contains(name);
    }
    
    /**
     * 获取在线用户数
     * @return	在线用户数
     */
    public int getNumberOfUsers() {
        return users.size();
    }
    
    /**
     * 强制某用户下线
     * @param name 用户名
     */
    public void kick(String name) {
        synchronized (sessions) {
            for (IoSession session : sessions) {
                if (name.equals(session.getAttribute("user"))) {
                    session.close(true);
                    break;
                }
            }
        }
    }
}
分享到:
评论
1 楼 greemranqq 2013-02-04  
这个 怎么使用呢?
效果是什么哦?

相关推荐

    Mina官网例子之时间服务器

    **Mina官网例子之时间服务器** Apache Mina(Minimum Asynchronous Network)是一个高度可扩展的网络通信框架,它为各种协议提供了低级别的基础结构,包括TCP/IP和UDP/IP。Mina的目标是简化网络编程,使其变得高效...

    mina 服务器开发例子

    在提供的压缩包文件"Mina2Demo"中,可能包含了完整的Mina服务器开发示例代码,包括项目的结构、配置文件以及具体实现类。你可以通过解压并运行这些代码,来亲身体验Mina的强大功能。 总结来说,Mina是一个强大的...

    mina2 cs 客户端服务器通信 已经实现完整通信代码

    在“MINA2 CS客户端服务器通信”中,我们关注的是如何利用MINA2框架实现客户端与服务器之间的有效通信。下面将详细介绍MINA2框架以及如何实现客户端和服务器的通信。 MINA2全称为"Multi-purpose Infrastructure for...

    apache-mina例子

    Apache Mina是一个开源项目,主要用于构建高...在`MinaTimeServer`和`MinaClient`的例子中,我们可以看到如何使用Mina轻松地建立一个简单的服务器和客户端通信系统,这对于理解和学习Mina的基本用法是非常有帮助的。

    mina源码+例子mina-2.0.0-M6.zip

    3. **编写简单的应用**:从例子入手,创建一个简单的MINA服务器和客户端,理解它们之间的通信机制。 4. **实现自定义过滤器**:根据需求,编写自定义的过滤器,以实现特定的数据处理功能。 5. **性能调优**:了解...

    mina 服务器简介,个人感觉不错

    以下是对Mina服务器核心概念的详细解释: 1. **IoAcceptor**: IoAcceptor是Mina中的关键组件,它负责监听和接受来自客户端的连接请求。一旦有新的连接请求,IoAcceptor会创建一个新的IoSession实例,以管理与...

    MINA源码与例子

    MINA的目标是为开发者提供一个简单易用但功能强大的库,使得他们能够构建网络应用,如TCP/IP和UDP协议的服务器和客户端,而无需深入理解底层网络编程的复杂性。 MINA的核心设计理念是基于非阻塞I/O(Non-blocking I...

    Mina官方例子所有jar包

    包含了官方例子中所有相关的jar包:log4j, mina-core, mina-integration-jmx, mina-statemachine, org.springframework.context, slf4j-api, slf4j-log4j12等

    mina服务器和客服端实现

    2. **Mina服务器实现** - **创建Bootstrap**:首先,我们需要创建一个ServerBootstrap实例,它是服务器的配置中心,可以设置线程池、缓冲区大小、心跳机制等。 - **绑定端口**:接着,通过bind方法指定监听的端口...

    mina2推送demo客户端

    《MINA2推送Demo客户端详解及应用...通过对这个例子的深入学习和实践,开发者不仅可以掌握MINA2的基本用法,还能了解到如何利用MINA2构建高效、可靠的网络应用,这对于任何致力于网络编程的开发者来说都是宝贵的资源。

    Apache Mina2服务器和客户端简单实例

    在本实例中,我们将探讨如何使用Apache Mina2构建一个简单的服务器和客户端。 首先,让我们了解一下Mina2的核心概念。Mina2基于Java NIO(Non-blocking I/O)库,提供了异步I/O操作,这意味着它不会因为等待数据而...

    Mina开发之服务器

    Mina开发之服务器的代码,详情请查看:http://www.cnblogs.com/getherBlog/p/3937196.html Mina开发之客户端的代码,详情请查看:http://www.cnblogs.com/getherBlog/p/3937196.html

    mina2技术知识

    MINA2(全称:Java Multi-Protocol Infrastructure)是Apache软件基金会的一个开源项目,主要针对网络应用程序开发,尤其适用于创建高性能、高可扩展性的网络服务器。MINA2提供了一个抽象层,允许开发者编写与传输...

    websocket+java服务器(mina)

    1. **创建ServerBootstrap**:这是Mina服务器的基础,用于配置服务器的线程模型、处理链等。 2. **设置ChildHandler**:配置一个IoHandler,处理客户端的连接建立、消息接收和断开连接等事件。 3. **实现WebSocket...

    mina通讯例子

    这个"mina通讯例子"展示了如何利用MINA库来实现客户端与服务器之间的对象通信。 在MINA中,核心概念包括`Session`、`Filter`和`Handler`。`Session`代表了网络连接,它提供了读写数据的方法;`Filter`是数据处理链...

    mina客户端服务器简易Demo

    为了使学习过程更加直观,配合Mina的官方文档,你可以了解到更多关于如何配置和使用这些组件的细节,包括事件驱动模型、过滤器链以及如何处理异步通信等。Mina的API设计得非常灵活,可以方便地适应各种网络通信需求...

    Mina客户端服务器Demo

    **Mina客户端服务器Demo**是基于Apache Mina框架的一个示例项目,主要展示了如何使用Mina进行网络通信的开发。Apache Mina是一个高度可扩展且轻量级的Java框架,主要用于构建高性能、高效率的网络应用程序,如TCP/IP...

    MINA 服务器端实现 可运行

    通过"MINA_Server_Test"这个项目,开发者可以深入理解MINA框架如何工作,如何构建一个高性能的网络服务器,并且能够与"MINA_Client_Test"配合,进行实际的通信测试,验证服务器的正确性和效率。 总之,MINA为Java...

    mina2核心框架

    《MINA2核心框架:构建高性能网络应用》 MINA(Java Multithreaded Network Application Framework)是一个由Apache软件基金会开发的开源网络通信框架,主要应用于构建高性能、高可用性的网络服务。MINA2作为其最新...

Global site tag (gtag.js) - Google Analytics