mina例子

本文介绍了一个基于MINA框架的简单聊天服务器实现。通过自定义编解码器,服务器能够接收客户端的消息并转发给指定的目标客户端。文章提供了完整的代码示例,包括服务器端、客户端代码及消息对象等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所需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存储连接的用户

  1. import java.io.IOException;  
  2. import java.net.InetSocketAddress;  
  3. import java.util.Hashtable;  
  4. import java.util.Map;  
  5.   
  6. import org.apache.mina.core.service.IoAcceptor;  
  7. import org.apache.mina.core.service.IoHandlerAdapter;  
  8. import org.apache.mina.core.session.IdleStatus;  
  9. import org.apache.mina.core.session.IoSession;  
  10. import org.apache.mina.filter.codec.ProtocolCodecFilter;  
  11. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;  
  12.   
  13. public class Server extends IoHandlerAdapter {  
  14.       
  15.     private Map<Integer, IoSession> userMap;  
  16.       
  17.     public Server() {  
  18.         super();  
  19.         // TODO Auto-generated constructor stub  
  20.         userMap = new Hashtable<Integer, IoSession>();  
  21.         IoAcceptor acceptor = new NioSocketAcceptor();  
  22.         acceptor.getFilterChain().addLast("codec"new ProtocolCodecFilter(new CFactory("server")));  
  23.         acceptor.setHandler(this);  
  24.         acceptor.getSessionConfig().setReadBufferSize(2048);  
  25.         acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);  
  26.         try {  
  27.             acceptor.bind(new InetSocketAddress(Constants.PORT));  
  28.         } catch (IOException e) {  
  29.             // TODO Auto-generated catch block  
  30.             e.printStackTrace();  
  31.         }  
  32.     }  
  33.   
  34.     /** 
  35.      * @param args 
  36.      * @throws IOException  
  37.      */  
  38.     public static void main(String[] args) throws IOException {  
  39.         // TODO Auto-generated method stub  
  40.         new Server();  
  41.     }  
  42.       
  43.     /* (non-Javadoc) 
  44.      * @see org.apache.mina.core.service.IoHandlerAdapter#messageReceived(org.apache.mina.core.session.IoSession, java.lang.Object) 
  45.      */  
  46.     public void messageReceived(IoSession session, Object message) throws Exception {  
  47.         Msg msg = (Msg)message;  
  48.         System.out.println(msg.toString());  
  49.         userMap.put(msg.getFuserId(), session);  
  50.         if(msg.getTuserId() > 0 && userMap.get(msg.getTuserId()) != null) {  
  51.             userMap.get(msg.getTuserId()).write(msg);  
  52.         }  
  53.     }  
  54. }  
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 stub
		userMap = 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 block
			e.printStackTrace();
		}
	}

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		new 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:

  1. import org.apache.mina.core.session.IoSession;  
  2. import org.apache.mina.filter.codec.ProtocolCodecFactory;  
  3. import org.apache.mina.filter.codec.ProtocolDecoder;  
  4. import org.apache.mina.filter.codec.ProtocolEncoder;  
  5.   
  6. public class CFactory implements ProtocolCodecFactory {  
  7.       
  8.     private ProtocolDecoder decoder;  
  9.     private ProtocolEncoder encoder;  
  10.       
  11.     public CFactory(String name) {  
  12.         this(name, false);  
  13.     }  
  14.       
  15.     public CFactory(String name, boolean showLog) {  
  16.         decoder = new BDecoder(name, showLog);  
  17.         encoder = new BEncoder(name, showLog);  
  18.     }  
  19.   
  20.     @Override  
  21.     public ProtocolEncoder getEncoder(IoSession session) throws Exception {  
  22.         // TODO Auto-generated method stub  
  23.         return encoder;  
  24.     }  
  25.   
  26.     @Override  
  27.     public ProtocolDecoder getDecoder(IoSession session) throws Exception {  
  28.         // TODO Auto-generated method stub  
  29.         return decoder;  
  30.     }  
  31.   
  32. }  
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);
	}

	@Override
	public ProtocolEncoder getEncoder(IoSession session) throws Exception {
		// TODO Auto-generated method stub
		return encoder;
	}

	@Override
	public ProtocolDecoder getDecoder(IoSession session) throws Exception {
		// TODO Auto-generated method stub
		return decoder;
	}

}


 

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

  1. import java.nio.charset.Charset;  
  2.   
  3. import org.apache.mina.core.buffer.IoBuffer;  
  4. import org.apache.mina.core.session.IoSession;  
  5. import org.apache.mina.filter.codec.CumulativeProtocolDecoder;  
  6. import org.apache.mina.filter.codec.ProtocolDecoderOutput;  
  7.   
  8. public class BDecoder extends CumulativeProtocolDecoder {  
  9.       
  10.     private String name;  
  11.     private boolean showLog;  
  12.   
  13.     public BDecoder(String name, boolean showLog) {  
  14.         super();  
  15.         this.name = name;  
  16.         this.showLog = showLog;  
  17.     }  
  18.   
  19.     @Override  
  20.     protected boolean doDecode(IoSession session, IoBuffer in,  
  21.             ProtocolDecoderOutput out) throws Exception {  
  22.         // TODO Auto-generated method stub  
  23.         Msg msg = new Msg(in.getInt(), in.getInt(), in.getInt(),   
  24.                 in.getString(Charset.forName(Constants.DEFAULTCHARSET).newDecoder()));  
  25.         out.write(msg);  
  26.         if(showLog) {  
  27.             String log = msg.toString() + "\t" + name + " decode";  
  28.             System.out.println(log);  
  29.         }  
  30.         return true;  
  31.     }  
  32.   
  33. }  
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;
	}

	@Override
	protected boolean doDecode(IoSession session, IoBuffer in,
			ProtocolDecoderOutput out) throws Exception {
		// TODO Auto-generated method stub
		Msg 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并写入输出流

  1. import java.nio.charset.Charset;  
  2.   
  3. import org.apache.mina.core.buffer.IoBuffer;  
  4. import org.apache.mina.core.session.IoSession;  
  5. import org.apache.mina.filter.codec.ProtocolEncoderAdapter;  
  6. import org.apache.mina.filter.codec.ProtocolEncoderOutput;  
  7.   
  8. public class BEncoder extends ProtocolEncoderAdapter {  
  9.   
  10.     private String name;  
  11.     private boolean showLog;  
  12.       
  13.     public BEncoder(String name, boolean showLog) {  
  14.         super();  
  15.         this.name = name;  
  16.         this.showLog = showLog;  
  17.     }  
  18.   
  19.     @Override  
  20.     public void encode(IoSession session, Object message,  
  21.             ProtocolEncoderOutput out) throws Exception {  
  22.         // TODO Auto-generated method stub  
  23.         Msg msg = (Msg)message;  
  24.         if(showLog) {  
  25.             String log = msg.toString() + "\t" + name + " encode";  
  26.             System.out.println(log);  
  27.         }  
  28.         IoBuffer buffer = IoBuffer.allocate(0false);     
  29.         buffer.setAutoExpand(true);     
  30.         buffer.putInt(msg.getCode());  
  31.         buffer.putInt(msg.getFuserId());  
  32.         buffer.putInt(msg.getTuserId());  
  33.         buffer.putString(msg.getMsg(), Charset.forName(Constants.DEFAULTCHARSET).newEncoder());  
  34.         buffer.flip();     
  35.         out.write(buffer);  
  36.     }  
  37. }  
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;
	}

	@Override
	public void encode(IoSession session, Object message,
			ProtocolEncoderOutput out) throws Exception {
		// TODO Auto-generated method stub
		Msg 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端:图方便

  1. import java.net.InetSocketAddress;  
  2. import java.util.List;  
  3. import java.util.Vector;  
  4.   
  5. import org.apache.mina.core.service.IoHandlerAdapter;  
  6. import org.apache.mina.core.session.IoSession;  
  7. import org.apache.mina.filter.codec.ProtocolCodecFilter;  
  8. import org.apache.mina.transport.socket.SocketConnector;  
  9. import org.apache.mina.transport.socket.nio.NioSocketConnector;  
  10.   
  11. public class Client extends IoHandlerAdapter {  
  12.   
  13.     private int id;  
  14.     private SocketConnector connector;  
  15.     private InetSocketAddress address;  
  16.     private List<Msg> list;  
  17.       
  18.     public Client(int id) {  
  19.         super();  
  20.         this.id = id;  
  21.         list = new Vector<Msg>();  
  22.         connector = new NioSocketConnector();     
  23.         connector.getFilterChain().addLast("codec"new ProtocolCodecFilter(new CFactory("client_" + id)));     
  24.         connector.setHandler(this);     
  25.         address = new InetSocketAddress("127.0.0.1", Constants.PORT);  
  26.         list.add(new Msg(0,id, 0""));  
  27.         connector.connect(address);  
  28.     }  
  29.       
  30.     public void send(Msg msg) throws Exception {  
  31.         list.add(msg);  
  32.         connector.connect(address);  
  33.     }  
  34.       
  35.     public void messageReceived(IoSession session, Object message) throws Exception {     
  36.         System.out.println("messageReceived:" + message.toString());  
  37.     }  
  38.       
  39.     public void sessionCreated(IoSession session) throws Exception {  
  40.         System.out.println("sessionCreated");  
  41.         synchronized(list) {  
  42.             if(list != null && !list.isEmpty()) {  
  43.                 session.write(list.get(0));  
  44.                 list.remove(0);  
  45.             }  
  46.         }  
  47.     }  
  48.       
  49.     public void sessionOpened(IoSession session) throws Exception {  
  50.         System.out.println("sessionOpened");  
  51.     }  
  52.   
  53.     public int getId() {  
  54.         return id;  
  55.     }  
  56. }  
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;
	}
}


常量类

  1. public class Constants {  
  2.   
  3.     public static final String DEFAULTCHARSET = "UTF-8";  
  4.     public static final int PORT = 9125;  
  5. }  
public class Constants {

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


消息对象

  1. import java.io.Serializable;  
  2.   
  3. public class Msg implements Serializable {  
  4.   
  5.     private static final long serialVersionUID = 3352801416609666672L;  
  6.       
  7.     private int code;  
  8.     private int fuserId;  
  9.     private int tuserId;  
  10.     private String msg;  
  11.     public String toString() {  
  12.         return new StringBuilder()  
  13.         .append("code:").append(code)  
  14.         .append("fuserId:").append(fuserId)  
  15.         .append("tuserId:").append(tuserId)  
  16.         .append("msg").append(msg)  
  17.         .toString();  
  18.     }  
  19.     public Msg() {  
  20.         super();  
  21.         // TODO Auto-generated constructor stub  
  22.     }  
  23.     public Msg(int code, int fuserId, int tuserId, String msg) {  
  24.         super();  
  25.         this.code = code;  
  26.         this.fuserId = fuserId;  
  27.         this.tuserId = tuserId;  
  28.         this.msg = msg;  
  29.     }  
  30.     public int getCode() {  
  31.         return code;  
  32.     }  
  33.     public void setCode(int code) {  
  34.         this.code = code;  
  35.     }  
  36.     public int getFuserId() {  
  37.         return fuserId;  
  38.     }  
  39.     public void setFuserId(int fuserId) {  
  40.         this.fuserId = fuserId;  
  41.     }  
  42.     public int getTuserId() {  
  43.         return tuserId;  
  44.     }  
  45.     public void setTuserId(int tuserId) {  
  46.         this.tuserId = tuserId;  
  47.     }  
  48.     public String getMsg() {  
  49.         return msg;  
  50.     }  
  51.     public void setMsg(String msg) {  
  52.         this.msg = msg;  
  53.     }  
  54. }  
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;
	}
}


客户端启动类

  1. import java.io.BufferedReader;  
  2. import java.io.InputStreamReader;  
  3.   
  4. public class Mc {  
  5.   
  6.     public static void main(String[] args) throws Exception {  
  7.         BufferedReader r = new BufferedReader(new InputStreamReader(System.in));  
  8.         String s = null;  
  9.         Client c = new Client(Integer.parseInt(args[0]));  
  10. //      Client c = null;  
  11. //      if((s = r.readLine()) != null)  
  12. //          c = new Client(Integer.parseInt(s));  
  13.         while((s = r.readLine()) != null) {  
  14.             String[] ss = createClient(s);  
  15.             if(ss != null)  
  16.                 c.send(new Msg(0, c.getId(), Integer.parseInt(ss[0]), ss[1]));  
  17.         }  
  18.     }  
  19.       
  20.     public static String[] createClient(String s) {  
  21.         for(int i = 0; i < s.length(); i ++) {  
  22.             if(s.charAt(i) == ' ')  
  23.                 return new String[]{s.substring(0, i), s.substring(i)};  
  24.         }  
  25.         return null;  
  26.     }  
  27. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值