mina例子

news/2025/3/5 3:12:25/

所需jar包mina-core.jar,slf4j-api.jar,slf4j-jdk14.jar

最基本的对象,Server端 及其Handler用来接收消息;ProtocolCodecFactory包含decoder和encoder用来对消息进行编解码,可自定义也可使用mina自带的。

client端选择较多,http,telnet,自己写socket连,用mina提供的connector都可以。

贴代码了。

这个例子中写了个简单的聊天服务器,接收客户端消息,并转发给目的客户端。

 

server:图方便,直接继承IoHandlerAdapter 。用以map存储连接的用户

import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.Hashtable;
import java.util.Map;import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;public class Server extends IoHandlerAdapter {private Map<Integer, IoSession> userMap;public Server() {super();// TODO Auto-generated constructor stubuserMap = new Hashtable<Integer, IoSession>();IoAcceptor acceptor = new NioSocketAcceptor();acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new CFactory("server")));acceptor.setHandler(this);acceptor.getSessionConfig().setReadBufferSize(2048);acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);try {acceptor.bind(new InetSocketAddress(Constants.PORT));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** @param args* @throws IOException */public static void main(String[] args) throws IOException {// TODO Auto-generated method stubnew Server();}/* (non-Javadoc)* @see org.apache.mina.core.service.IoHandlerAdapter#messageReceived(org.apache.mina.core.session.IoSession, java.lang.Object)*/public void messageReceived(IoSession session, Object message) throws Exception {Msg msg = (Msg)message;System.out.println(msg.toString());userMap.put(msg.getFuserId(), session);if(msg.getTuserId() > 0 && userMap.get(msg.getTuserId()) != null) {userMap.get(msg.getTuserId()).write(msg);}}
}

 

ProtocolCodecFactory:

import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFactory;
import org.apache.mina.filter.codec.ProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolEncoder;public class CFactory implements ProtocolCodecFactory {private ProtocolDecoder decoder;private ProtocolEncoder encoder;public CFactory(String name) {this(name, false);}public CFactory(String name, boolean showLog) {decoder = new BDecoder(name, showLog);encoder = new BEncoder(name, showLog);}@Overridepublic ProtocolEncoder getEncoder(IoSession session) throws Exception {// TODO Auto-generated method stubreturn encoder;}@Overridepublic ProtocolDecoder getDecoder(IoSession session) throws Exception {// TODO Auto-generated method stubreturn decoder;}}


 

decoder:从会话中读出数据并转为对象,写入输出流

import java.nio.charset.Charset;import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;public class BDecoder extends CumulativeProtocolDecoder {private String name;private boolean showLog;public BDecoder(String name, boolean showLog) {super();this.name = name;this.showLog = showLog;}@Overrideprotected boolean doDecode(IoSession session, IoBuffer in,ProtocolDecoderOutput out) throws Exception {// TODO Auto-generated method stubMsg msg = new Msg(in.getInt(), in.getInt(), in.getInt(), in.getString(Charset.forName(Constants.DEFAULTCHARSET).newDecoder()));out.write(msg);if(showLog) {String log = msg.toString() + "\t" + name + " decode";System.out.println(log);}return true;}}


encoder:将对象转为IObuffer并写入输出流

import java.nio.charset.Charset;import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;public class BEncoder extends ProtocolEncoderAdapter {private String name;private boolean showLog;public BEncoder(String name, boolean showLog) {super();this.name = name;this.showLog = showLog;}@Overridepublic void encode(IoSession session, Object message,ProtocolEncoderOutput out) throws Exception {// TODO Auto-generated method stubMsg msg = (Msg)message;if(showLog) {String log = msg.toString() + "\t" + name + " encode";System.out.println(log);}IoBuffer buffer = IoBuffer.allocate(0, false);   buffer.setAutoExpand(true);   buffer.putInt(msg.getCode());buffer.putInt(msg.getFuserId());buffer.putInt(msg.getTuserId());buffer.putString(msg.getMsg(), Charset.forName(Constants.DEFAULTCHARSET).newEncoder());buffer.flip();   out.write(buffer);}
}


client端:图方便

import java.net.InetSocketAddress;
import java.util.List;
import java.util.Vector;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.transport.socket.SocketConnector;
import org.apache.mina.transport.socket.nio.NioSocketConnector;public class Client extends IoHandlerAdapter {private int id;private SocketConnector connector;private InetSocketAddress address;private List<Msg> list;public Client(int id) {super();this.id = id;list = new Vector<Msg>();connector = new NioSocketConnector();   connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new CFactory("client_" + id)));   connector.setHandler(this);   address = new InetSocketAddress("127.0.0.1", Constants.PORT);list.add(new Msg(0,id, 0, ""));connector.connect(address);}public void send(Msg msg) throws Exception {list.add(msg);connector.connect(address);}public void messageReceived(IoSession session, Object message) throws Exception {   System.out.println("messageReceived:" + message.toString());}public void sessionCreated(IoSession session) throws Exception {System.out.println("sessionCreated");synchronized(list) {if(list != null && !list.isEmpty()) {session.write(list.get(0));list.remove(0);}}}public void sessionOpened(IoSession session) throws Exception {System.out.println("sessionOpened");}public int getId() {return id;}
}


常量类

public class Constants {public static final String DEFAULTCHARSET = "UTF-8";public static final int PORT = 9125;
}


消息对象

import java.io.Serializable;public class Msg implements Serializable {private static final long serialVersionUID = 3352801416609666672L;private int code;private int fuserId;private int tuserId;private String msg;public String toString() {return new StringBuilder().append("code:").append(code).append("fuserId:").append(fuserId).append("tuserId:").append(tuserId).append("msg").append(msg).toString();}public Msg() {super();// TODO Auto-generated constructor stub}public Msg(int code, int fuserId, int tuserId, String msg) {super();this.code = code;this.fuserId = fuserId;this.tuserId = tuserId;this.msg = msg;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public int getFuserId() {return fuserId;}public void setFuserId(int fuserId) {this.fuserId = fuserId;}public int getTuserId() {return tuserId;}public void setTuserId(int tuserId) {this.tuserId = tuserId;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}


客户端启动类

import java.io.BufferedReader;
import java.io.InputStreamReader;public class Mc {public static void main(String[] args) throws Exception {BufferedReader r = new BufferedReader(new InputStreamReader(System.in));String s = null;Client c = new Client(Integer.parseInt(args[0]));
//		Client c = null;
//		if((s = r.readLine()) != null)
//			c = new Client(Integer.parseInt(s));while((s = r.readLine()) != null) {String[] ss = createClient(s);if(ss != null)c.send(new Msg(0, c.getId(), Integer.parseInt(ss[0]), ss[1]));}}public static String[] createClient(String s) {for(int i = 0; i < s.length(); i ++) {if(s.charAt(i) == ' ')return new String[]{s.substring(0, i), s.substring(i)};}return null;}
}


 


 


http://www.ppmy.cn/news/362325.html

相关文章

马氏距离 (马哈拉诺比斯距离) (Mahalanobis distance)

马氏距离(Mahalanobis distance)是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的&#xff0c;表示点与一个分布之间的距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是&#xff0c;它考虑到各种特性之间的联系&#xff0c;本文介绍马氏距离相…

mara

修改前 [rootdhcp-0-116 marathon-1.0.6]# ./marathon .java.io.InvalidClassException: invalid field type for classpath in class net.sourceforge.marathon.runtime.JavaRuntimeProfile at java.io.ObjectInputStream.readClassDescriptor(libgcj.so.7rh) at java.io.Obj…

Mahalanobis距离(马氏距离)

Mahalanobis距离&#xff08;马氏距离&#xff09; Mahalanobis距离是多维空间中两点相似性的度量&#xff0c;它本身不是聚类或者分类算法。 Mahalanobis距离与Euclidean距离&#xff08;欧式距离&#xff09;类似&#xff0c;不过还需除以空间的协方差矩阵。 如果协方差矩…

Maven简介和Maven私服

更多精彩技术分享请浏览本人博客&#xff1a;https://blog.csdn.net/wohiusdashi 目录 1. Maven简介 1.1. 简述 1.2. Maven实现的核心价值 1.3. 定义与缩略语 1.4. 项目构建 1.5. 依赖管理 1.6. maven目录说明 1.7. maven坐标 …

GPIO(General Purpose Input/Output)

GPIO&#xff08;General Purpose Input/Output&#xff09;是通用输入输出引脚&#xff0c;可以用来控制和读取数字信号。在使用GPIO时&#xff0c;需要设置其输入或输出模式&#xff0c;其中输入模式又可以分为浮空输入、下拉输入、上拉输入和模拟输入。 1. 浮空输入&#x…

mina 资料

一、基础框架 IoService:IoService相当于是Mina的Socket层&#xff0c;负责所有SocketIO事件的注册&#xff0c;select,分发等。它位于org.apache.mina.core.service包内&#xff0c;它有两个子接口&#xff0c;表示Server端接收方的IoAcceptor和Client发起方的IoConnector&…

Mina介绍

基本介绍&#xff1a; Apache MINA 2是一个开发高性能和高可伸缩性网络应用程序的网络应用框架。它提供了一个抽象的事件驱动的异步API&#xff0c;可以使用TCP/IP、UDP/IP、串口和虚拟机内部的管道等传输方式。Apache MINA 2可以作为开发网络应用程序的一个良好基础。 Mina 的…

mina框架详解

Apache Mina Server 是一个网络通信应用框架&#xff0c;也就是说&#xff0c;它主要是对基于TCP/IP、UDP/IP协议栈的通信框架&#xff08;当然&#xff0c;也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等&#xff09;&#xff0c;Mina 可以帮助我们快速开发高性能、高…