练练手,用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,在统一的一个类中进行注册和查找。
附件是练手写的连接神仙道服务器的例子,可以收到服务器发来的玩家基本信息。
分享到:
相关推荐
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学习笔记(修订版)
MinaTimeServer示例是一个简单的时间服务器程序,使用Mina2.0框架实现。下面是MinaTimeServer示例的相关知识点: * MinaTimeServer类:继承了IoHandlerAdapter类,实现了messageReceived方法,用于处理incoming数据...
2. IoSession:代表一个客户端连接,提供了对客户端的数据读写操作。 3. IoFilterChain:负责对数据进行编码、解码、加密等操作。 4. IoHandler:负责处理客户端的数据请求和响应。 Mina2.0框架源码剖析 下面我们...
Mina 2.0 是一个基于Java NIO技术的高效、可伸缩的网络通信框架,广泛应用于服务器端开发。Mina 2.0 的设计目标是为开发者提供一个易于使用的API,使得开发者能够快速构建高性能的网络应用。 **1.1 Mina 2.0快速...
首先,需要了解 Mina2.0 的基本架构和设计原则,然后进行安装和配置,最后实现一个简单的客户端和服务器端。 知识点: * Mina2.0 的基本架构和设计原则 * Mina2.0 的安装和配置 * 客户端和服务器端的实现 二、...
Mina2.0作为其一个重要版本,引入了许多优化和改进,为开发者提供了更强大的功能和更高的灵活性。本文将对Mina2.0框架进行源码层面的剖析,以便深入理解其工作原理。 首先,让我们从`MinaTimeServer.java`这个示例...
1. **Mina 2.0框架**:Mina(Minimum Asynchronous Network)是一个高性能且易于使用的Java网络应用程序框架,它提供了一个通用的抽象层,简化了TCP/IP和UDP/IP协议的编程工作。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 - ...
MINA 通过提供统一的接口来隐藏 BIO 和 NIO 之间的差异,提供了一个高层接口来构建服务器或客户端。 MINA 的主要特点是能够处理大量的 socket 连接,并提供了一个高层接口来隐藏 BIO 和 NIO 之间的差异。MINA 还...
- **社区活跃**:作为一个成熟的开源项目,Mina2.0拥有庞大的用户群体和技术支持团队,可以为使用者提供及时有效的帮助。 总之,“mina2.0源码svn地址”为开发者提供了一个直接获取Mina2.0源代码的有效途径。通过...
本文将通过一个实例来深入理解 MINA 2.0 的核心概念和使用方法。 首先,我们来看`.classpath`和`.project`这两个文件,它们是Eclipse项目的一部分。`.classpath`文件包含了项目的类路径信息,指示了编译器和运行时...
mina是一个基于Java的网络应用框架,它使用Java NIO(New Input/Output)技术来实现高吞吐量和低延迟的网络通信。这本手册通过提供三个具体的示例(demo),让学习者在实践中掌握mina的应用。 mina框架在处理网络...
Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,主要用在开发网络通信应用,如TCP/IP和UDP协议的应用。Mina2.0作为其更新版本,提供了更丰富的功能和优化的性能,使得开发者能更高效地构建网络服务。 *...
Mina2.0是其一个重要的版本,提供了许多改进和新特性,使得开发者能够更轻松地处理网络通信任务,尤其是在Java NIO(Non-blocking Input/Output)环境下。 **1. Mina的异步事件驱动模型** Mina的核心设计理念是...