【第22期】观点:IT 行业加班,到底有没有价值?

Java——Mina 服务端和客户端实现输出HelloWorld

原创 2016年08月29日 16:33:08
一、mina是什么
  官方解释:Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步API,使Java NIO在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。
  官网地址:http://mina.apache.org/

  源码分析:http://my.oschina.net/ielts0909/blog/90355/


参考地址:http://www.blogjava.net/qileilove/archive/2013/12/17/407662.html


二、mina的工作流程

基于 Apache MINA 的网络应用有三个层次,分别是 I/O 服务、I/O 过滤器和 I/O 处理器:

_ I/O 服务:I/O 服务用来执行实际的 I/O 操作。Apache MINA 已经提供了一系列支持不同协议的 I/O 服务,如 TCP/IP、UDP/IP、串口和虚拟机内部的管道等。开发人员也可以实现自己的 I/O 服务。

_ I/O 过滤器:I/O 服务能够传输的是字节流,而上层应用需要的是特定的对象与数据结构。I/O 过滤器用来完成这两者之间的转换。I/O 过滤器的另外一个重要作用是对输入输出的数据进行处理,满足横切的需求。多个 I/O 过滤器串联起来,形成 I/O 过滤器链。

_ I/O 处理器:I/O 处理器用来执行具体的业务逻辑。对接收到的消息执行特定的处理。

创建一个完整的基于 Apache MINA 的网络应用,需要分别构建这三个层次。Apache MINA 已经为 I/O 服务和 I/O 过滤器提供了不少的实现,因此这两个层次在大多数情况下可以使用已有的实现。I/O 处理器由于是与具体的业务相关的,一般来说都是需要自己来实现的。

事件驱动的 API

Apache MINA 提供的是事件驱动的 API。它把与网络相关的各种活动抽象成事件。网络应用只需要对其感兴趣的事件进行处理即可。事件驱动的 API 使得基于 Apache MINA 开发网络应用变得比较简单。应用不需要考虑与底层传输相关的具体细节,而只需要处理抽象的 I/O 事件。比如在实现一个服务端应用的时候,如果有新的连接进来,I/O 服务会产生sessionOpened这样一个事件。如果该应用需要在有连接打开的时候,执行某些特定的操作,只需要在 I/O 处理器中此事件处理方法sessionOpened中添加相应的代码即可。


参考地址:http://blog.csdn.net/jacman/article/details/7432981


三、创建Mina的服务端和客户端,输出HelloWorld

1.需要引入的类库



2.服务端代码

2.1.创建Server

package com.ict.minaServer;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

import java.io.IOException;
import java.net.InetSocketAddress;

/**
 * Created by chenlong on 2016/8/29.
 */
public class MinaServer {
    public static void main(String[] args)
    {
        //创建ServerScoket
        SocketAcceptor acceptor = new NioSocketAcceptor();

        //设置传输方式(这里设置成对象传输模式,还有很多的类型后面会具体讲到
        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
        ProtocolCodecFilter filter = new ProtocolCodecFilter(
                new ObjectSerializationCodecFactory());
        chain.addLast("objectFilter", filter);

        MinaServerHanlder minaServerHanlder=new MinaServerHanlder();
        // 添加消息处理
        acceptor.setHandler(minaServerHanlder);

        // 开启服务器
        int bindPort = 10026;
        try {
            acceptor.bind(new InetSocketAddress(bindPort));
        } catch (IOException e) {
            e.printStackTrace();
        }


//        minaServerHanlder.messageSent();
    }
}


2.2.创建消息处理类

package com.ict.minaServer;

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

/**
 * Created by chenlong on 2016/8/29.
 */

public class MinaServerHanlder  extends IoHandlerAdapter {
    private int count = 0;

    // 由底层决定是否创建一个session
    public void sessionCreated(IoSession session) {
        System.out.println("新客户连接");
    }

    // 创建了session 后会回调sessionOpened
    public void sessionOpened(IoSession session) throws Exception {
        count++;
        System.out.println("第 " + count + " 个 client 登陆!address: : "
                + session.getRemoteAddress());

        sessionWrite(session);
    }

//    获取session连接,用来随时向客户端发送消息
    public void sessionWrite(IoSession session) throws Exception {
        session.write("Sent by Server1"+1);
        session.write("Sent by Server1"+2);
    }

    // 当收到了客户端发送的消息后会回调这个函数
    public void messageReceived(IoSession session, Object message)
            throws Exception {
        System.out.println("服务器收到客户端发送指令 :" );
        System.out.println(message);

//        session.write("Sent by Server1");

//        messageSent(session,"Sent by Server2");
    }

    public void messageSent(IoSession session, Object message) {
        System.out.println("message send to client");

//        session.write("Sent by Server3");
    }

    // session 关闭调用
    public void sessionClosed(IoSession session) {
        System.out.println("one client disconnect");
        session.closeNow();
    }

    // session 空闲的时候调用
    public void sessionIdle(IoSession session, IdleStatus status) {
        System.out.println("connect idle");
    }

    // 异常捕捉
    public void exceptionCaught(IoSession session, Throwable cause) {
        System.out.println("throws exception");
    }
}

3.客户端代码

3.1.创建客户端

package com.ict.minaClient;


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

import java.net.InetSocketAddress;

/**
 * Created by chenlong on 2016/8/29.
 */
public class MinaClient {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 创建Socket
        NioSocketConnector connector = new NioSocketConnector();
        //设置传输方式
        DefaultIoFilterChainBuilder chain = connector.getFilterChain();
        ProtocolCodecFilter filter = new ProtocolCodecFilter(new ObjectSerializationCodecFactory());
        chain.addLast("objectFilter", filter);

        //设置消息处理
        connector.setHandler(new MinaClientHanlder());
        //超时设置
        connector.setConnectTimeoutCheckInterval(30);
        //连接
        ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 10026));
        cf.awaitUninterruptibly();
        cf.getSession().getCloseFuture().awaitUninterruptibly();

        connector.dispose();

    }
}

3.2.创建客户端消息处理

package com.ict.minaClient;

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

/**
 * Created by chenlong on 2016/8/29.
 */
public class MinaClientHanlder extends IoHandlerAdapter {
    public void sessionOpened(IoSession session) throws Exception {
        System.out.println("客户端登陆");
        session.write("HelloWorld");

//        messageReceived(session,"");
        for (int i = 0; i < 10; i++) {
            session.write("p 412703840,4,1,1410248991,73451566,22615771,1239,125,90,0,0,1,900\r\n"
                    + "p 412703840,4,1,1410248991,73451566,22615771,1239,125,90,0,0,1,900\r\n"
                    + "p 412703840,4,1,1410248991,73451566,22615771,1239,125,90,0,0,1,900\r\n"
                    + "p 412703840,4,1,1410248991,73451566,22615771,1239,125,90,0,0,1,900");
        }
    }

    public void sessionClosed(IoSession session)
    {
        System.out.println("client close");
    }

    public void messageReceived(IoSession session , Object message)throws Exception
    {
        System.out.println("客户端接受到了消息"+message) ;

//        session.write("Sent by Client1");
    }
}


参考地址:http://blog.csdn.net/pdw_jsp/article/details/8603224


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

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

最基本的那个例子,也就是官网上的那个demo,我就不说了...1、demo地址:http://weavesky.com/2010/02/19/mina-article-2/  但是我们实际项目中,肯定...

Mina框架中使用Socket的例子,包括服务端和客户端。

最近研究了一下socket,以前是直接用的,感觉总不好,后来前辈给我介绍了mina。这个框架已经封装好了socket,非常方便,比起直接用socket来说优越性高点。 下面准备客户端和服务端的例子,...

Mina学习笔记(二) 简单客户端实例

上一篇实现了一个简单的服务端程序。 现在来实现一个客户端程序  程序功能: 客户端发送一个字符串给服务端, 服务端返回当前时间给客户端。 基于上一文中的项目 ,首先加入两个对象,分别是...

mina框架客户端与服务端+java+maven

import org.apache.mina.core.RuntimeIoException; import org.apache.mina.core.future.ConnectFuture; im...

【MINA】心跳机制

列上两篇好文章 http://www.cnblogs.com/pricks/p/3832882.html http://blog.csdn.net/cruise_h/article/det...

基于MINA构建简单高性能的NIO应用

mina是非常好的C/S架构的java服务器,这里转了一篇关于它的使用感受。 前言MINA是Trustin Lee最新制作的Java通讯chenyi8888
  • chenyi8888
  • 2010-03-03 13:23
  • 15271
  • Mina基础框架及客户端-服务端框架对应实现例子

    原文地址:Mina基础(Apache user guide Chapter2 basics)1.1.1. Mina应用架构    被问最多的问题就是,“Mina的基础应用看起来是什么样的呢?”。通过这...
    • boonya
    • boonya
    • 2016-06-01 18:18
    • 2153

    mina服务端与c++客户端通信1

    最近学习了Apache MINA通讯,在使用过程中碰到了一些问题,记录下一些心得。 在服务端和客户端都使用MINA提供的库时,通讯一切正常,当我把客户端改为C++代码时,发现客户端发送给服务端的二进...

    MINA服务端与C++客户端通讯 2

    Java与C++通讯还有编码转码的问题存在,假设通讯编码采用UTF-8 C++客户端发送时需要转码成UTF-8编码,接收服务端应答消息后再转回Unicode或者GBK编码 下面给出完成的C++客户...
    • WQ560
    • WQ560
    • 2012-05-09 16:35
    • 264

    使用Mina框架实现C/S通讯

    什么是Mina? Apache MINA is a network application framework which helps users develop... Apache MINA是一...
    收藏助手
    不良信息举报
    您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
    举报原因:
    原因补充:

    (最多只允许输入30个字)