Apache Mina入门案例

    Apache Mina是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架。它通过Java nio技术基于TCP/IP和UDP/IP协议提供了抽象的、事件驱动的、异步的API。我们可以使用mina解决一些点对点通信的问题。

首先是引入项目所需要的依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.dwl</groupId>
    <artifactId>minaproject</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.6</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.mina</groupId>
            <artifactId>mina-core</artifactId>
            <version>2.0.17</version>
        </dependency>
    </dependencies>
</project>

第二步服务端业务处理ServerHandler,这里继承自IoHandlerAdapter,重写其中的主要方法即可。

package com.mina;

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

/**
 * @program: minaproject
 * @description: 服务端hander
 * @author: daiwenlong
 * @create: 2018-08-09 14:47
 **/
public class ServerHandler extends IoHandlerAdapter{


    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
        System.out.println("=========server=======received:"+message);
        //回复客户端
        session.write("server return:"+message);
    }
}


编写服务端

package com.mina;

import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

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

/**
 * @program: minaproject
 * @description: 服务端
 * @author: daiwenlong
 * @create: 2018-08-09 14:58
 **/
public class MInaServer {
    public static void main(String[] args) throws Exception{

        IoAcceptor acceptor = new NioSocketAcceptor();
        acceptor.getFilterChain().addLast("logger", new LoggingFilter());
        acceptor.getFilterChain().addLast("codec",
                new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
        //设置处理器 就是业务逻辑处理的地方
        acceptor.setHandler(new ServerHandler());
        acceptor.bind(new InetSocketAddress(9764));
    }
}


服务端写好了我们可以运行这个main方法,使用telnet访问被监听的端口。

在telnet窗口向服务端发送数据后会收到服务端的回复。

 接下来我们继续写客户端的代码,首先是客户端的业务处理,跟服务端一样继承同一个类,重写其中几个主要的方法。

package com.mina;

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

/**
 * @program: minaproject
 * @description: 客户端handler
 * @author: daiwenlong
 * @create: 2018-08-09 15:39
 **/
public class ClientHandler extends IoHandlerAdapter {

    @Override
    public void messageSent(IoSession session, Object message) throws Exception {
        super.messageSent(session, message);
    }

    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
        System.out.println("========client========received:"+message);
    }
}


最后是客户端代码。

package com.mina;

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.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

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

/**
 * @program: minaproject
 * @description: 客户端
 * @author: daiwenlong
 * @create: 2018-08-09 15:50
 **/
public class Client {

    public static void main(String[] args) {
        NioSocketConnector connector = new NioSocketConnector();
        connector.getFilterChain().addLast("logger", new LoggingFilter());
        connector.getFilterChain().addLast("codec",
                new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
        //设置处理器 就是业务逻辑处理的地方
        connector.setHandler(new ClientHandler());
        ConnectFuture future = connector.connect(new InetSocketAddress("localhost",9764));
        future.awaitUninterruptibly();
        IoSession session = future.getSession();
        session.getConfig().setUseReadOperation(true);
        for(int i = 0;i<10;i++){
            session.write("----------test---------"+i);
        }

    }
}


启动客户端后可以看到客户端向服务端连续发送了10条信息,服务端收到信息后回复客户端。

服务端:

客户端:

猜你喜欢

转载自blog.csdn.net/DWL0208/article/details/81585030