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

练练手,用mina2.0搭建一个nio客户端

阅读更多
练练手,用mina2.0搭建一个nio客户端,连接服务器。

mina2用NioSocketConnector连接,以前mina1的时候叫SocketConnector,现在SocketConnector是一个接口,要注意下区别。

需要的东西,一个handler来处理各种io事件,一个ProtocolCodecFactory来对消息进行编码(ProtocolEncoder)和解码(ProtocolDecoder)。此外还需要自己编写一个MessageHandler来处理收到的信息。

编写一个类比如SxdHandler继承自IoHandlerAdapter,实现messageReceived,sessionCreated等方法。

编写一个类比如SxdCodecFactory继承自ProtocolCodecFactory来返回单例的编码者和解码者。

编写一个类比如SxdEncoder继承自ProtocolEncoder,来对自己的信息编码,编为IoBuffer输出。

编写一个类比如SxdDecoder继承自ProtocolDecoder,来对收到的字节缓冲区进行解析,解析成自己的消息放到ProtocolDecoderOutput,这样iohandler的messageReceived方法被调用,这个时候找到该信息对应的messagehandler,来进行消息处理。

程序流程,先创建一个NioSocketConnector,设置handel类,连接目标服务器,创建协议分析器到过滤器链中,然后就是等待操作了。
当连接打开时,iohandler的sessionOpened方法被调用,在这里发送比如登陆服务器的消息就行了,当收到消息,messageReceived会被调用,找到这个消息的handler,开始处理就行了。

下面是创建client实例代码:
		NioSocketConnector conn = new NioSocketConnector();
		conn.setConnectTimeoutMillis(30*1000l);
		conn.setHandler(new SxdHandler());
		ConnectFuture cf = conn.connect(new InetSocketAddress("8x007.xd.com", 8002));
		
		conn.getFilterChain().addLast("codec", new ProtocolCodecFilter(new SxdCodecFactory()));
		conn.getFilterChain().addLast( "logging", new LoggingFilter() );
		cf.awaitUninterruptibly();
		cf.getSession().getCloseFuture().awaitUninterruptibly();
		conn.dispose();


关键的一点如何设计消息,消息分C->S的发送消息(CGMessage)和S->C的接受信息(GCMessage),
消息最后是通过字节流在网上传输的,因此需要知道消息的长度,然后是类型,最后是数据客户端和服务端按照相同协议解析和发送消息。
这是消息的抽象定义,提供了读写方法。

import java.io.UnsupportedEncodingException;
import org.apache.mina.core.buffer.IoBuffer;

public abstract class Message {
	
	protected IoBuffer buff;
	
	public byte module;
	public byte func;
	
	public Message(byte module, byte func){
		this.module = module;
		this.func = func;
	};
	int length = 0;
	public void write(){
		if(buff == null){
			buff = IoBuffer.allocate(0).setAutoExpand(true);
		}
		buff.clear();
		buff.putInt(0);//先占位,再
		buff.put(module);
		buff.put(func);
		writeImpl();
		length = buff.position() - 4;
		buff.putInt(0, length);
//		buff.capacity(length + 4);
		buff.flip();
		
	}
	
	public abstract void writeImpl();  
	public  void read(){
		length = buff.getInt() - 4;
		buff.get();
		buff.get();
		this.readImpl();
	}
	public abstract void readImpl();  
	
	public IoBuffer getBuff() {
		return buff;
	}

	public void setBuff(IoBuffer buff) {
		this.buff = buff;
	}
	
	protected void writeString(String s){
		buff.putShort((short) s.length());
		try {
			buff.put(s.getBytes("UTF-8"));
		} catch (UnsupportedEncodingException e) { 
			e.printStackTrace();
		}
	}
	protected void writeInt(int i){
		buff.putInt(i);
	}
	protected void writeShort(short s){
		buff.putShort(s);
	}

	public int getLength() {
		return length + 4;
	}
	
	protected String readString(){
		short len = buff.getShort();
		byte[] bs =new byte[len];
		buff.get(bs);
		try {
			return new String(bs, "UTF-8");
		} catch (UnsupportedEncodingException e) { 
			e.printStackTrace();
			return new String(bs);
		}
	}
	protected int readInt(){
		return buff.getInt();
	}
	protected short readShort(){
		return buff.getShort();
	}
	protected byte readByte(){
		return buff.get();
	}
	protected long readLong(){
		return buff.getLong();
	}
	public String getKey(){
		return module+"_"+func;
	}
} 

针对GCMessage,还需要编写一个MessageHandler来处理这个message,在统一的一个类中进行注册和查找。

附件是练手写的连接神仙道服务器的例子,可以收到服务器发来的玩家基本信息。
分享到:
评论

相关推荐

    Android Java Socket框架 Mina2.0

    Mina2.0是Apache软件基金会的一个开源项目,它是一个网络通信框架,主要应用于Java环境。Mina旨在简化高性能、高可用性和高可扩展性的网络应用开发,特别适合于处理大量并发连接的情况。在Android平台上,虽然Java...

    Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)

    Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)

    Mina2.0框架源码剖析.pdf

    MinaTimeServer示例是一个简单的时间服务器程序,使用Mina2.0框架实现。下面是MinaTimeServer示例的相关知识点: * MinaTimeServer类:继承了IoHandlerAdapter类,实现了messageReceived方法,用于处理incoming数据...

    Mina2.0快速入门与源码剖析

    2. IoSession:代表一个客户端连接,提供了对客户端的数据读写操作。 3. IoFilterChain:负责对数据进行编码、解码、加密等操作。 4. IoHandler:负责处理客户端的数据请求和响应。 Mina2.0框架源码剖析 下面我们...

    Mina 2.0快速入门与源码解析

    Mina 2.0 是一个基于Java NIO技术的高效、可伸缩的网络通信框架,广泛应用于服务器端开发。Mina 2.0 的设计目标是为开发者提供一个易于使用的API,使得开发者能够快速构建高性能的网络应用。 **1.1 Mina 2.0快速...

    Mina2.0快速入门与源码剖析.docx

    首先,需要了解 Mina2.0 的基本架构和设计原则,然后进行安装和配置,最后实现一个简单的客户端和服务器端。 知识点: * Mina2.0 的基本架构和设计原则 * Mina2.0 的安装和配置 * 客户端和服务器端的实现 二、...

    Mina2.0框架源码剖析

    Mina2.0作为其一个重要版本,引入了许多优化和改进,为开发者提供了更强大的功能和更高的灵活性。本文将对Mina2.0框架进行源码层面的剖析,以便深入理解其工作原理。 首先,让我们从`MinaTimeServer.java`这个示例...

    mina2.0案例

    1. **Mina 2.0框架**:Mina(Minimum Asynchronous Network)是一个高性能且易于使用的Java网络应用程序框架,它提供了一个通用的抽象层,简化了TCP/IP和UDP/IP协议的编程工作。Mina 2.0版本在前一版本的基础上进行...

    Mina 2.0 User Guide(Mina 2.0 用户指南)

    MINA 2.0 User Guide Part I - Basics Chapter 1 - Getting Started Chapter 2 - Basics Chapter 3 - Service Chapter 4 - Session Chapter 5 - Filters Chapter 6 - Transports Chapter 7 - Handler Part II - ...

    MINA2.0用户手册中文随笔翻译

    MINA 通过提供统一的接口来隐藏 BIO 和 NIO 之间的差异,提供了一个高层接口来构建服务器或客户端。 MINA 的主要特点是能够处理大量的 socket 连接,并提供了一个高层接口来隐藏 BIO 和 NIO 之间的差异。MINA 还...

    Mina2.0学习笔记(修订版)

    - **单线程阻塞服务器**:效率低下,每个请求需等待前一个请求处理完成。 - **多线程阻塞服务器**:提升并发能力,但线程管理复杂。 - **使用JDK线程池的阻塞服务器**:简化线程管理,但仍受限于阻塞I/O。 - **基于...

    mina2.0源码svn地址

    - **社区活跃**:作为一个成熟的开源项目,Mina2.0拥有庞大的用户群体和技术支持团队,可以为使用者提供及时有效的帮助。 总之,“mina2.0源码svn地址”为开发者提供了一个直接获取Mina2.0源代码的有效途径。通过...

    mina2.0下一个例子

    本文将通过一个实例来深入理解 MINA 2.0 的核心概念和使用方法。 首先,我们来看`.classpath`和`.project`这两个文件,它们是Eclipse项目的一部分。`.classpath`文件包含了项目的类路径信息,指示了编译器和运行时...

    Mina2.0自学手册

    mina是一个基于Java的网络应用框架,它使用Java NIO(New Input/Output)技术来实现高吞吐量和低延迟的网络通信。这本手册通过提供三个具体的示例(demo),让学习者在实践中掌握mina的应用。 mina框架在处理网络...

    MIna2.0学习笔记

    Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,主要用在开发网络通信应用,如TCP/IP和UDP协议的应用。Mina2.0作为其更新版本,提供了更丰富的功能和优化的性能,使得开发者能更高效地构建网络服务。 *...

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

    Mina2.0是其一个重要的版本,提供了许多改进和新特性,使得开发者能够更轻松地处理网络通信任务,尤其是在Java NIO(Non-blocking Input/Output)环境下。 **1. Mina的异步事件驱动模型** Mina的核心设计理念是...

    Mina2.0完全剖析,完全自学手册

    本节将详细介绍如何从零开始构建一个简单的Mina应用程序,涵盖从下载所需JAR包到编写服务端和客户端程序的全过程。 ##### 第一步. 下载使用的Jar包 为了开始Mina的应用开发,首先需要下载以下必要的库: 1. **Mina ...

Global site tag (gtag.js) - Google Analytics