`
i2534
  • 浏览: 182836 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mina的小demo

    博客分类:
  • util
阅读更多

最近很无聊,找些新玩意玩玩,正好看到了mina的介绍,下了2.0M5的zip,看看example,再查查资料,写了下面的列子,虽然简单,但是问题还真不少,好在快下班的时候搞定了,留个纪念,有空再扩展.

看名字就知道是啥,看人家的命名,真不是盖得.

唯一一点要注意的就是session在关闭时的参数,如果有数据没有flush,可能就是报错.如果有多个地方同时关闭,可能会死锁...

package com.hcycom.lan;

import java.net.InetSocketAddress;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

public class ServerHandler extends IoHandlerAdapter {

	@Override
	public void exceptionCaught(IoSession session, Throwable cause)
			throws Exception {
		cause.printStackTrace();
		session.close(false);
	}

	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		String s = message.toString();
		System.out.println("收到请求:" + s);
		if (s != null) {
			int i = getPoint(s);
			if (session.isConnected()) {
				if (i >= 95) {
					session.write("运气不错,你可以出去了.");
					session.close(false);
					return;
				}
				Integer count = (Integer) session.getAttribute(Server.KEY);
				count++;
				session.setAttribute(Server.KEY, count);
				session.write("抱歉,你运气太差了,第" + count + "次请求未被通过,继续在小黑屋里呆着吧.");
			} else {
				session.close(true);
			}
		}
	}

	@Override
	public void messageSent(IoSession session, Object message) throws Exception {
		System.out.println("发给客户端: " + message.toString());
	}

	@Override
	public void sessionClosed(IoSession session) throws Exception {
		long l = session.getCreationTime();
		System.out.println("来自" + getInfo(session) + "的会话已经关闭,它已经存活了 "
				+ (System.currentTimeMillis() - l) + "毫秒.");
	}

	@Override
	public void sessionCreated(IoSession session) throws Exception {
		System.out.println("给" + getInfo(session) + "创建了一个新会话.");
	}

	@Override
	public void sessionIdle(IoSession session, IdleStatus status)
			throws Exception {
		System.out.println("来自" + getInfo(session) + "的会话在闲置,状态为"
				+ status.toString());
	}

	@Override
	public void sessionOpened(IoSession session) throws Exception {
		session.setAttribute(Server.KEY, 0);
		System.out.println("和" + getInfo(session) + "的会话已经打开.");
	}

	public String getInfo(IoSession session) {
		if (session == null) {
			return null;
		}
		InetSocketAddress address = (InetSocketAddress) session
				.getRemoteAddress();
		int port = address.getPort();
		String ip = address.getAddress().getHostAddress();
		return ip + ":" + port;
	}

	public int getPoint(String s) {
		if (s == null) {
			return -1;
		}
		Pattern p = Pattern.compile("^[\u0041-\uFFFF,]*(\\d+).*$");
		Matcher m = p.matcher(s);
		if (m.matches()) {
			return Integer.valueOf(m.group(1));
		}
		return 0;
	}

}

  客户端,直接继承了HandlerAdapter,不需要写啥太复杂的东西

package com.hcycom.lan;

import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.util.Random;

import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.future.IoFutureListener;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

public class Client extends IoHandlerAdapter {
	private Random random = new Random(System.currentTimeMillis());

	public Client() {
		IoConnector connector = new NioSocketConnector();
		connector.getFilterChain().addLast(
				"text",
				new ProtocolCodecFilter(new TextLineCodecFactory(Charset
						.forName(Server.ENCODE))));
		connector.setHandler(this);
		ConnectFuture future = connector.connect(new InetSocketAddress(
				"127.0.0.1", Server.PORT));
		future.awaitUninterruptibly();
		future.addListener(new IoFutureListener<ConnectFuture>() {

			@Override
			public void operationComplete(ConnectFuture future) {
				IoSession session = future.getSession();
				while (!session.isClosing()) {
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					String message = "你好,我roll了" + random.nextInt(100) + "点.";
					session.write(message);
				}
			}
		});
		connector.dispose();
	}

	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		System.out.println("批复:" + message.toString());
	}

	@Override
	public void messageSent(IoSession session, Object message) throws Exception {
		System.out.println("报告:" + message.toString());
	}

	@Override
	public void exceptionCaught(IoSession session, Throwable cause)
			throws Exception {
		cause.printStackTrace();
		session.close(true);
	}

	public static void main(String[] args) {
		for (int i = 0; i < 10; i++) {
			new Client();
		}
	}
}

 server端,更简单,就是要注意filter,客户端要和服务器端一致,这里用的是传字符串的,mina实现了很多filter,包括传对象的,有空再玩.

package com.hcycom.lan;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class Server {

	public static final int PORT = 2534;
	public static final String ENCODE = "UTF-8";
	public static final String KEY = "roll";

	public static void main(String[] args) {
		SocketAcceptor acceptor = new NioSocketAcceptor();
		acceptor.getFilterChain().addLast(
				"text",
				new ProtocolCodecFilter(new TextLineCodecFactory(Charset
						.forName(ENCODE))));
		acceptor.setHandler(new ServerHandler());
		try {
			acceptor.bind(new InetSocketAddress(PORT));
			System.out.println("游戏开始,你想出去吗,来,碰碰运气吧!");
		} catch (IOException e) {
			e.printStackTrace();
			acceptor.dispose();
		}
	}
 }
分享到:
评论
1 楼 wuwu8023 2010-03-12  
老兄你在你的Server 加上连接池 在客户端关闭连接的时候是不是会报错啊 你试试

相关推荐

    Mina小Demo聊天工具

    《Mina小Demo聊天工具详解》 Mina小Demo是一款基于Java开发的轻量级聊天工具,它利用了Apache Mina框架,集成了Swing图形用户界面,使得用户可以方便地进行实时通信。这款工具的独特之处在于其独立性,不仅可以在...

    Apache Mina 入门Demo

    7. **minaDemo项目结构**:压缩包中的minaDemo项目可能包含以下组件:主类(启动服务)、配置文件(如XML配置服务)、过滤器实现、编码解码器、以及IoHandler的实现。通过分析这个Demo,我们可以了解到如何实际搭建...

    minaDemo的实例

    "MinaDemo"是使用MINA框架的一个示例项目,通常包含了从创建服务器端到客户端连接的基本流程。 在MINA中,服务端主要通过`ServerBootstrap`类配置并启动,它允许开发者定制I/O处理模型、线程模型、协议编码解码器等...

    mina 聊天Demo

    这个“mina聊天Demo”是一个基于Mina实现的简单聊天应用示例,利用Java Swing作为客户端界面。在这个项目中,我们将深入探讨Mina的核心概念、如何与Swing集成以及如何构建一个基本的聊天系统。 1. **Apache Mina...

    Mina通信Demo

    在"MinaDemo"项目中,主要包含以下几个关键部分: - **Bootstrap**: 定义服务器或客户端的启动配置,包括传输协议、处理器、事件处理器等。 - **Handler**: 处理网络事件的类,如连接建立、数据读写、连接关闭等。 ...

    Mina开发实例(服务端、客户端)DEMO

    在这个"Mina开发实例(服务端、客户端)DEMO"中,我们将深入探讨Mina如何实现长连接通讯。 首先,我们来理解服务端(Server)的实现。在Mina中,服务端通常通过`IoAcceptor`接口来创建,它是监听并接受客户端连接的...

    Mina 使用DEMO

    **Mina 框架详解及DEMO演示** Apache Mina 是一款开源的网络通信框架,主要用于构建高性能、高效率的网络应用服务器。Mina 提供了一种抽象层,简化了网络编程,允许开发者专注于业务逻辑,而无需关心底层协议的实现...

    mina即时聊天demo

    **mina即时聊天demo** Mina(Java Multithreaded Application Network Architecture)是一个开源的网络通信框架,由Apache软件基金会开发并维护。它提供了一个高度可扩展的、高性能的、事件驱动的I/O服务架构,广泛...

    mina demo全套

    《mina demo全套》详解 Apache Mina是一个高度可扩展且基于事件驱动的网络通信框架,主要应用于Java平台。它提供了一种简单的方式来构建高性能、高可用性的网络应用程序,如服务器和客户端。Mina的核心概念是它支持...

    mina客户端服务器简易Demo

    《mina客户端服务器简易Demo详解》 Apache Mina(Minimum Asynchronous Network)是一个开源的网络通信框架,它为Java开发者提供了一种简单而高效的方式来构建高性能、高可用性的网络应用程序,如TCP/IP和UDP/IP...

    Apache mina2学习笔记DEMO

    在这个"Apache MINA2学习笔记DEMO"中,我们很可能会看到如何使用MINA来创建一个自定义协议的示例。自定义协议通常是为了满足特定应用的需求,例如高效的数据传输、安全性或者特定的编码格式。MINA允许开发者定义自己...

    mina2推送demo客户端

    《MINA2推送Demo客户端详解及应用》 MINA(Multi-purpose Infrastructure for Network Applications)是一个高性能、异步的网络通信框架,由Apache软件基金会开发,主要用于构建网络应用程序,如TCP/IP和UDP/IP协议...

    可以运行的Mina udp demo

    **Mina UDP Demo详解** Mina (Java Invented Network Application Platform) 是一款强大的网络通信框架,主要用于构建高性能、高可用性的网络应用。它提供了一种简单的方式来处理TCP/IP和UDP/IP协议,使得开发者...

    mina框架的demo 入门,开发

    Mina框架是一个基于Java的网络通信应用框架,它为高性能、高可用性的网络应用程序提供了强大的支持。本教程将深入探讨Mina框架的入门与开发,帮助你快速掌握这个框架的关键概念和技术。 首先,理解Mina的核心概念至...

    Android使用Mina与服务器通信Demo(包括服务端)

    **Android使用Mina与服务器通信Demo** Mina(Minimum Asynchronous Network)是一个高度可扩展的、高性能的网络应用开发框架,常用于构建基于TCP和UDP的网络应用,如服务器和客户端。在Android平台上,Mina可以帮助...

    Mina框架使用demo

    在这个"Mina框架使用demo"中,我们将深入探讨如何利用Mina来实现长连接,以及如何使用其提供的API,如心跳服务和自定义编解码器。 首先,长连接是网络通信中的一个关键概念,它允许客户端和服务器之间的连接保持...

    mina demo mina jar包

    "Mina demo mina jar包"指的是使用Apache Mina框架创建的一个演示示例,这个示例展示了如何运行一个基本的服务端,能够接收客户端的数据并返回响应。 在Mina框架中,服务端通常会创建一个Acceptor,监听特定的端口...

    mina通信demo

    这个“Mina通信demo”是为了帮助初学者理解和掌握Mina的基本用法而创建的。通过分析这个demo,我们可以深入理解Mina如何实现客户端与服务器之间的高效通信。 **1. Mina简介** Mina全称为"Minimum Asynchronous ...

    mina源代码java demo(亲测可用)

    Apache MINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可扩展性的网络应用程序。它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的事件驱动的异步API。 上传自己修改的demo,java版...

    mina经典demo

    Apache组织应用程序(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。mina经典demo,希望对后来人有所帮助

Global site tag (gtag.js) - Google Analytics