mina学习基础-入门实例-传输以回车做为结尾的字符串(一)

Apache的MINA(Multipurpose InfraStructure Networked Application)是一个网络应用框架,
它提供了一个抽象的,事件驱动的异步API,使Java NIO可以在各种传输协议(例如TCP和UDP协议)下高效开发.
下面通过一个简单的实例学习一下如何使用mina开发服务器端和客户端.
1.开发服务器端.
  a.创建名为mina-server的web项目,引入必须的jar包.

  b.创建服务器端,直接看代码MinaServer.java,

package com.ilucky.mina.server;

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

import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

/**
 * @author IluckySi
 * @date 20140507
 */
public class MinaServer {
	
	private static int PORT = 4000;
	
	public static void main(String[] args) {
		//创建接收器.
		IoAcceptor acceptor = new NioSocketAcceptor();
		try {
			//添加过滤器.
			acceptor.getFilterChain().addLast( 
					"codec", 
					new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),
							LineDelimiter.WINDOWS.getValue(),
							LineDelimiter.WINDOWS.getValue())));
			//设置读取数据的缓冲区大小.
			acceptor.getSessionConfig().setReadBufferSize(2048);
			//设置读写通道10秒内无操作进入空闲状态.
			acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
			//添加业务处理器.
			acceptor.setHandler(new MinaServerIoHandler()); 
			//为服务器绑定监听端口.
			acceptor.bind(new InetSocketAddress(PORT));
			System.out.println("服务端启动成功!");
		} catch (Exception e) {
			System.out.println("服务端启动异常!");
		}
	}
}

创建MinaServer服务器最重要的三步:创建接收器-添加消息过滤器-添加业务处理器.

    接收器使用NioSocketAcceptor,这是一个非阻塞的socket连接,
    过滤器使用mina自带的TextLineCodec过滤器,该过滤器指定参数为windows的换行符,即服务器收到客户端发送来的消息中只要有
    windows换行符(\r\n),服务器就认为是一个完整消息,而服务器发送给客户端的消息都会默认在消息末尾添加(\r\n)文本换行符.
    自定义的业务处理器继承了IoHandlerAdapter类,覆盖了父类的7个方法,其中最重要的一个方法是messageReceived方法.

    直接看代码MinaServerIoHandler,

package com.ilucky.mina.server;

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

/**
 * @author IluckySi
 * @date 20140507
 */
public class MinaServerIoHandler extends IoHandlerAdapter  {

	 public void messageReceived(IoSession session, Object message) throws Exception {
         String  msg = message.toString();
         System.out.println("服务器收到客户端消息" + msg);
         session.write("success!");
	  }
}

messageReceived方法用来接收客户端发送过来的消息,并通过seesion写回给客户端.

2.测试服务器端.
   通过在cmd窗口执行telent 127.0.0.1 4000连接服务器,然后输入测试消息test,回车便会在服务器后台打印出接收到的消息,同时客户端也
   会接收到服务器写回的消息.
3.开发客户端.
  a.创建名为mina-client的web项目,引入必须的jar包.

  b.创建客户端,直接看代码MinaClient.java,

package com.ilucky.mina.client;

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

import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

/**
 * @author IluckySi
 * @date 20140507
 */
public class MinaClient {

    public static final String HOST = "127.0.0.1";
    
    public static final int PORT = 4000;
    
    public static void main(String[] args) {
        //创建连接器.
        IoConnector connector = new NioSocketConnector();  
        //设置超时时间.
        connector.setConnectTimeoutMillis(30000);
         //添加消息过滤器
        connector.getFilterChain().addLast(  
                "codec",
                new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"), 
                        LineDelimiter.WINDOWS.getValue(),
                        LineDelimiter.WINDOWS.getValue())));
        //添加业务理器.
        connector.setHandler(new MinaClientHandler());
        IoSession session = null;
        try {
            //创建连接.
            ConnectFuture future = connector.connect(new InetSocketAddress(HOST, PORT));
            // 等待连接创建完成
            future.awaitUninterruptibly();
            session = future.getSession();
            String msg = "Hello, mina-server!";
            session.write(msg);
            System.out.println("客户端向服务器发送消息" + msg);;
        } catch (Exception e) {
            System.out.println("客户端发送消息失败!");
        }
        //等待连接断开, 即线程阻塞在这里, 一直等到服务器关闭此session后, 线程才会继续执行.
        session.getCloseFuture().awaitUninterruptibly();
        //释放资源.
        connector.dispose();
    }
}

创建MinaClient服务器最重要的三步:创建连接器-添加消息过滤器-添加业务处理器.

    连接器使用NioSocketConnector,这是一个非阻塞的socket连接,
    过滤器使用mina自带的TextLineCodec过滤器,该过滤器指定参数为windows的换行符,即服务器收到客户端发送来的消息中只要有windows
    换行符(\r\n),服务器就认为是一个完整消息,而服务器发送给客户端的消息都会默认在消息末尾添加(\r\n)文本换行符.
    自定义的业务处理器继承了IoHandlerAdapter类,覆盖了父类的7个方法,其中最重要的一个方法是messageReceived方法.

    直接看代码MinaClientIoHandler,

package com.ilucky.mina.client;

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

/**
 * @author IluckySi
 * @date 20140507
 */
public class MinaClientHandler extends IoHandlerAdapter  {

	 public void messageReceived(IoSession session, Object message) throws Exception {
            String  msg = message.toString();
            System.out.println("客户端收到服务器返回的消息" + msg);
	 }
}

messageReceived方法用来接收服务器写回的消息.

4.测试客户端.
  先启动服务器端,再启动客户单,客户端成功发送消息,服务器端成功接收消息,并成功写回消息.

5.长连接和短连接.
  成功启动服务器端和客户端完成测试后,打开windows的任务管理器,发现当前操作系统中启动了3个java进程(注意其中一个进程是myEclipse的),
  java应用程序的入口是main()方法,启动一个main()方法相当于运行一个Java虚拟机,操作系统中也会相应启动一个进程,
  因此在任务管理器中有三个进程,一个是mina-server的,一个是mina-client的,一个是myeclipse的,这里的进程是长连接,即如果不手动停止
  会一直存在,长连接的现象在网络中非常普遍,例如qq,登录成功后qq客户端与qq服务器建立的就是长连接,除非主动关闭qq客户端,或是
  qq服务器挂了.与长连接相对应的是短连接,比如常见的请求/响应模式,例如HTTP协议,客户端向服务器发送一个请求,建立连接后,
  服务端处理并响应成功,此时就主动断开连接了.短连接是一个简单而有效的处理方式,也是应用最广的.Mina是Java NIO实现的应用框架,
  更倾向于短连接的服务.mina-server的业务逻辑器中有一个方法messageSent,即服务器写回给客户端后调用此方法,此时关闭session,
  直接看代码MinaServerIoHandler.

package com.ilucky.mina.server;

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

/**
 * @author IluckySi
 * @date 20140507
 */
public class MinaServerIoHandler extends IoHandlerAdapter  {

	 public void messageReceived(IoSession session, Object message) throws Exception {
         String  msg = message.toString();
         System.out.println("服务器收到客户端消息" + msg);
         session.write("success!");
	  }
	 
	 public void messageSent(IoSession session, Object message) throws Exception {
		 session.close(true);
		 System.out.println("一次请求结束!");
	 }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值