Mina客户端Client和Server对象传输demo

Posted Potter

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mina客户端Client和Server对象传输demo相关的知识,希望对你有一定的参考价值。

最基本的那个例子,也就是官网上的那个demo,我就不说了...

1、demo地址:http://weavesky.com/2010/02/19/mina-article-2/ 

但是我们实际项目中,肯定比不是如此的传输一两个数据的,我们需要传对象...老样子在此上传demo的源代码

此例子参考了himi的博文,博文地址:http://www.himigame.com/category/apache-mina

官网网站:http://mina.apache.org/mina-project/userguide/user-guide-toc.html

2、依赖的包:

mina-core-2.0.7.jar

slf4j-api-1.7.2.jar

slf4j-jdk14-1.7.2.jar

slf4j-log4j12-1.7.2.jar

3、客户端和服务端目录结构图:


一、Server

1、MinaServer

package com.potter;

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

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NiosocketAcceptor;

public class MinaServer 
	private static final int bindPort=8899;
	public static void main(String[] args)
		SocketAcceptor acceptor = new NioSocketAcceptor();
		
		DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
		
		ProtocolCodecFilter filter= new ProtocolCodecFilter(new HCoderFactory(Charset.forName("UTF-8"))); 
		//添加编码过滤器 处理乱码问题、编码问题
		chain.addLast("objectFilter",filter);
		//设置核心消息业务处理器
		acceptor.setHandler(new MinaServerHanlder());
		
		try 
			// 绑定端口
			acceptor.bind(new InetSocketAddress(bindPort));
		 catch (IOException e) 
			 System.out.println("Mina Server start for error!"+bindPort);
			e.printStackTrace();
		
		
		System.out.println("Mina Server run done! on port:"+bindPort);
	

2、MinaServerHanlder

package com.potter;

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

public class MinaServerHanlder extends IoHandlerAdapter 
	private int count = 0;

	public void sessionCreated(IoSession session) 
		System.out.println("新客户端连接");
	

	@Override
	public void sessionOpened(IoSession session) throws Exception 
		// TODO Auto-generated method stub
		count++;
		System.out.println("第 " + count + " 个 client 登陆!address: : "
				+ session.getRemoteAddress());
	

	@Override
	public void sessionClosed(IoSession session) throws Exception 
		// TODO Auto-generated method stub
		session.close();
		System.out.println("I'm Client &&  I closed!");
	

	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception 
		// TODO Auto-generated method stub
		PlayerAccount_Entity ho = (PlayerAccount_Entity) message;
		System.out.println("Client message="+ho.getId()+ho.getName()+ho.getEmailAdress()+ho.getSex()); 
        
//     	session.write(ho);
	

3、HCoderFactory

package com.potter;


import java.nio.charset.Charset;

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 HCoderFactory implements ProtocolCodecFactory      
	private final HEncoder encoder;    
	private final HDecoder decoder;     
	public HCoderFactory() 
		this(Charset.defaultCharset());    
	     
	public HCoderFactory(Charset charSet)         
		this.encoder = new HEncoder(charSet);        
		this.decoder = new HDecoder(charSet);    
	
	@Override
	public ProtocolDecoder getDecoder(IoSession arg0) throws Exception 
		// TODO Auto-generated method stub
		return decoder;
	
	@Override
	public ProtocolEncoder getEncoder(IoSession arg0) throws Exception 
		// TODO Auto-generated method stub
		return encoder;
	     
	

4、HEncoder

package com.potter;

import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoder;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;

public class HEncoder implements ProtocolEncoder
	private final Charset charset;

	public HEncoder(Charset charset) 
		this.charset = charset;
	

	@Override
	public void encode(IoSession session, Object message,
			ProtocolEncoderOutput out) throws Exception 
		CharsetEncoder ce = charset.newEncoder();
		PlayerAccount_Entity paEntity = (PlayerAccount_Entity) message;
		IoBuffer buffer = IoBuffer.allocate(100).setAutoExpand(true);
		buffer.putInt(paEntity.getId());
		buffer.putString(paEntity.getName(), ce);
		buffer.putString(paEntity.getEmailAdress(), ce);
		buffer.putInt(paEntity.getSex());
		buffer.flip();
		out.write(buffer);
	

	@Override
	public void dispose(IoSession session) throws Exception 
		// TODO Auto-generated method stub
		
	

5、HDecoder

package com.potter;


import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;

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 HDecoder extends CumulativeProtocolDecoder 
	private final Charset charset;

	public HDecoder(Charset charset) 
		this.charset = charset;
	

	@Override
	protected boolean doDecode(IoSession arg0, IoBuffer message,
			ProtocolDecoderOutput arg2) throws Exception 
		CharsetDecoder cd = charset.newDecoder();
		int id=0;
		if(message.remaining()>=4)
			id=message.getInt();
		
		String name = message.getString(cd);
		String emailAdress=message.getString(cd);
		int sex=0;
		if(message.remaining()>=4)
			sex=message.getInt();
		
		
		PlayerAccount_Entity paEntity = new PlayerAccount_Entity(id,name,emailAdress,sex);
		
		arg2.write(paEntity);
		return true;
	

6、PlayerAccount_Entity

package com.potter;

public class PlayerAccount_Entity
	private int id;    
	private String name;    
	private String emailAdress;    
	private int sex;// 0=man 1=woman
	
	public PlayerAccount_Entity(int id,String name,String emailAdress,int sex)
		this.id=id;
		this.name=name;
		this.emailAdress=emailAdress;
		this.sex=sex;
	
	 
	public int getId() 
		return id;
	
	public void setId(int id) 
		this.id = id;
	
	public String getName() 
		return name;
	
	public void setName(String name) 
		this.name = name;
	
	public String getEmailAdress() 
		return emailAdress;
	
	public void setEmailAdress(String emailAdress) 
		this.emailAdress = emailAdress;
	
	public int getSex() 
		return sex;
	
	public void setSex(int sex) 
		this.sex = sex;
	


二、Client

1、MinaClient

package com.potter;

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

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

public class MinaClient 
	private static final int bindPort=8899;
	public static void main(String[] args)
		// 创建一个socket连接      
		NioSocketConnector connector=new NioSocketConnector();
		// 获取过滤器链        
		DefaultIoFilterChainBuilder chain=connector.getFilterChain();
		
		ProtocolCodecFilter filter= new ProtocolCodecFilter(new HCoderFactory(Charset.forName("UTF-8"))); 
		// 添加编码过滤器 处理乱码、编码问题  
		chain.addLast("objectFilter",filter);
		// 消息核心处理器     
		connector.setHandler(new MinaClientHanlder());
		// 设置链接超时时间     
		connector.setConnectTimeoutCheckInterval(30);
		// 连接服务器,知道端口、地址    
		ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",bindPort));
		// 等待连接创建完成    
		cf.awaitUninterruptibly();
		cf.getSession().getCloseFuture().awaitUninterruptibly();
		connector.dispose();
	


 

2、MinaClientHanlder

package com.potter;

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

public class MinaClientHanlder extends IoHandlerAdapter
	
	public void sessionOpened(IoSession session) throws Exception 
		 PlayerAccount_Entity ho = new PlayerAccount_Entity(10,"Potter","potter@qq.com",0);
	     session.write(ho);
    
	
	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception 
		PlayerAccount_Entity ho = (PlayerAccount_Entity) message;        
		System.out.println("Server Say:name:" + ho.getName());
	
	
	@Override
	public void sessionClosed(IoSession session) throws Exception 
		// TODO Auto-generated method stub
		session.close();
	


好了,共同的就不穿了....

以上是关于Mina客户端Client和Server对象传输demo的主要内容,如果未能解决你的问题,请参考以下文章

FTP的主动传输模式(PORT Mode)及被动传输模式(Passive Mode)(PASV)(FTP客户端 client 服务端 server 通信原理)

matlab server-client传输数据

图解Apache Mina

TCP

Delphi 文件传输

iperf -r 和-d 双向测试是啥意思?是client和server相互发包么?