这是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;
}
}
}
}
}
分享到:
相关推荐
**Mina官网例子之时间服务器** Apache Mina(Minimum Asynchronous Network)是一个高度可扩展的网络通信框架,它为各种协议提供了低级别的基础结构,包括TCP/IP和UDP/IP。Mina的目标是简化网络编程,使其变得高效...
在提供的压缩包文件"Mina2Demo"中,可能包含了完整的Mina服务器开发示例代码,包括项目的结构、配置文件以及具体实现类。你可以通过解压并运行这些代码,来亲身体验Mina的强大功能。 总结来说,Mina是一个强大的...
1. **创建ServerBootstrap**:这是Mina服务器的基础,用于配置服务器的线程模型、处理链等。 2. **设置ChildHandler**:配置一个IoHandler,处理客户端的连接建立、消息接收和断开连接等事件。 3. **实现WebSocket...
在“MINA2 CS客户端服务器通信”中,我们关注的是如何利用MINA2框架实现客户端与服务器之间的有效通信。下面将详细介绍MINA2框架以及如何实现客户端和服务器的通信。 MINA2全称为"Multi-purpose Infrastructure for...
Apache Mina是一个开源项目,主要用于构建高...在`MinaTimeServer`和`MinaClient`的例子中,我们可以看到如何使用Mina轻松地建立一个简单的服务器和客户端通信系统,这对于理解和学习Mina的基本用法是非常有帮助的。
3. **编写简单的应用**:从例子入手,创建一个简单的MINA服务器和客户端,理解它们之间的通信机制。 4. **实现自定义过滤器**:根据需求,编写自定义的过滤器,以实现特定的数据处理功能。 5. **性能调优**:了解...
以下是对Mina服务器核心概念的详细解释: 1. **IoAcceptor**: IoAcceptor是Mina中的关键组件,它负责监听和接受来自客户端的连接请求。一旦有新的连接请求,IoAcceptor会创建一个新的IoSession实例,以管理与...
MINA的目标是为开发者提供一个简单易用但功能强大的库,使得他们能够构建网络应用,如TCP/IP和UDP协议的服务器和客户端,而无需深入理解底层网络编程的复杂性。 MINA的核心设计理念是基于非阻塞I/O(Non-blocking I...
包含了官方例子中所有相关的jar包:log4j, mina-core, mina-integration-jmx, mina-statemachine, org.springframework.context, slf4j-api, slf4j-log4j12等
2. **Mina服务器实现** - **创建Bootstrap**:首先,我们需要创建一个ServerBootstrap实例,它是服务器的配置中心,可以设置线程池、缓冲区大小、心跳机制等。 - **绑定端口**:接着,通过bind方法指定监听的端口...
《MINA2推送Demo客户端详解及应用...通过对这个例子的深入学习和实践,开发者不仅可以掌握MINA2的基本用法,还能了解到如何利用MINA2构建高效、可靠的网络应用,这对于任何致力于网络编程的开发者来说都是宝贵的资源。
在本实例中,我们将探讨如何使用Apache Mina2构建一个简单的服务器和客户端。 首先,让我们了解一下Mina2的核心概念。Mina2基于Java NIO(Non-blocking I/O)库,提供了异步I/O操作,这意味着它不会因为等待数据而...
Mina开发之服务器的代码,详情请查看:http://www.cnblogs.com/getherBlog/p/3937196.html Mina开发之客户端的代码,详情请查看:http://www.cnblogs.com/getherBlog/p/3937196.html
MINA2(全称:Java Multi-Protocol Infrastructure)是Apache软件基金会的一个开源项目,主要针对网络应用程序开发,尤其适用于创建高性能、高可扩展性的网络服务器。MINA2提供了一个抽象层,允许开发者编写与传输...
这个"mina通讯例子"展示了如何利用MINA库来实现客户端与服务器之间的对象通信。 在MINA中,核心概念包括`Session`、`Filter`和`Handler`。`Session`代表了网络连接,它提供了读写数据的方法;`Filter`是数据处理链...
**Mina客户端服务器Demo**是基于Apache Mina框架的一个示例项目,主要展示了如何使用Mina进行网络通信的开发。Apache Mina是一个高度可扩展且轻量级的Java框架,主要用于构建高性能、高效率的网络应用程序,如TCP/IP...
通过"MINA_Server_Test"这个项目,开发者可以深入理解MINA框架如何工作,如何构建一个高性能的网络服务器,并且能够与"MINA_Client_Test"配合,进行实际的通信测试,验证服务器的正确性和效率。 总之,MINA为Java...
《MINA2核心框架:构建高性能网络应用》 MINA(Java Multithreaded Network Application Framework)是一个由Apache软件基金会开发的开源网络通信框架,主要应用于构建高性能、高可用性的网络服务。MINA2作为其最新...
这个"mina权威性能测试例子"是针对Apache Mina的一个实际性能测试案例,旨在展示在特定环境下Mina如何处理大量并发连接。在这个测试中,四台客户端机器同时对服务器进行压力测试,结果显示服务器可以轻松地处理一万...