mina nio 示例

服务端代码:

1.Main.java


public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Server server = new Server();
        boolean flag = server.start();
        if(flag) System.out.println("服务端开始");
    }

}


2.Server.java


import java.net.InetSocketAddress;
import org.apache.mina.filter.executor.ExecutorFilter;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class Server {
    static final int PORT = 20087;
    NioSocketAcceptor acceptor = null;
    
    public Server() {
        
    }

    public boolean start() {
        //创建一个非阻塞的server端的Socket
        acceptor = new NioSocketAcceptor();
        acceptor.getSessionConfig().setUseReadOperation(true);
        //绑定过滤器
        acceptor.getFilterChain().addLast("logger", new LoggingFilter());
        //必须要设置ExecutorFilter,否则无法messageReceived中向客户端反馈同步消息会在wfutrue.awaitUninterruptibly()处长期挂起
        //同时客户端要设置connector.getSessionConfig().setUseReadOperation(true);

        acceptor.getFilterChain().addLast("exceutor", new ExecutorFilter());  
        //设置为非延迟发送,为true则不组装成打包发送,收到东西马上发出
        acceptor.getSessionConfig().setTcpNoDelay(true);
        
        //绑定处理类
        acceptor.setHandler(new ServerHandler2());  
        try {
            //绑定端口
            acceptor.bind(new InetSocketAddress(PORT));
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
    
}


3.ServerHandler2.java

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.future.WriteFuture;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

public class ServerHandler2 extends IoHandlerAdapter {

    @Override
    public void exceptionCaught(IoSession session, Throwable throwable)
            throws Exception {
        System.out.println("发生异常: " +throwable.getMessage());
        session.close(true);

    }

    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
        IoBuffer ioBuffer = (IoBuffer)message;
        int limit = ioBuffer.limit();
        System.out.println("limit = "+ limit);
       byte[] b = new byte[6];
       ioBuffer.get(b);
    
      String msg=new String(b);
    
      byte[] bb = new byte[limit-6];  
      ioBuffer.get(bb);
   
      String msg2=new String(bb);
    
      System.out.println("收到客户端发来的消息为: [" + msg+msg2+"]");
          
          brodcast(session);

    }

    private void brodcast(IoSession session) {
        System.out.println("回复客户端");
        byte[] returnStr = "收到".getBytes();
          //将测试消息会送给客户端
          IoBuffer returnMsg = IoBuffer.wrap(returnStr);
          
          WriteFuture wfutrue =session.write(returnMsg);
         
          wfutrue.awaitUninterruptibly();
          if(wfutrue.isWritten()){
              System.out.println("服务端回复完毕");
          }else{
              System.out.println("服务端回复失败");
          }
    }


    @Override
    public void sessionClosed(IoSession session) throws Exception {
        System.out.println(session.getRemoteAddress() + "is Disconnection");
        session = null;
    }

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

    }

     /**
      * 当一个客户端连接进入时
      */
     @Override
     public void sessionOpened(IoSession session) throws Exception {

      System.out.println("incoming client: " + session.getRemoteAddress());

     }

}


=========================

客户端代码1:


1.Main.java


public class Main {

    /**
     * Mina NIO client 连接 Mina NIO server
     */
    public static void main(String[] args) {
        Client client = new Client();
        client.start();
    }

}


2.Client.java


import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.future.ReadFuture;
import org.apache.mina.core.future.WriteFuture;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;


public class Client {
    public void start() {
        //创建一个非阻塞的客户端程序
        NioSocketConnector connector = new NioSocketConnector();

        //必须要配置
        connector.getSessionConfig().setUseReadOperation(true);
        connector.getFilterChain().addLast("logger", new LoggingFilter());
        //设置为非延迟发送,为true则不组装成打包发送,收到东西马上发出
        connector.getSessionConfig().setTcpNoDelay(true);
        //添加业务逻辑处理类
        connector.setHandler(new ClientHandler());
        String hostName = "127.0.0.1";
        try {
            InetAddress ipAddress = InetAddress.getByName(hostName);
            int port = 20087;
            //创建连接
            ConnectFuture confuture = connector.connect(new InetSocketAddress(ipAddress, port));
            //等待连接创建完成
            confuture.awaitUninterruptibly();
            if(confuture.isConnected()){
                System.out.println("客户端启动");
                IoSession session = confuture.getSession();
                byte[] arr = "hello world".getBytes();
                IoBuffer returnMsg = IoBuffer.wrap(arr);
                
                WriteFuture wfuture = session.write(returnMsg);
                
                wfuture.awaitUninterruptibly();
                if(wfuture.isWritten()){
                    System.out.println("客户端发送成功, 等待服务端反馈信息");
                    ReadFuture readFuture = session.read();
                    readFuture.awaitUninterruptibly();
                    //是否响应成功
                    if(readFuture.isRead()){
                        //获取消息
                        Object message  = readFuture.getMessage();
                        IoBuffer ioBuffer = (IoBuffer)message;  
                        byte[] b = new byte[ioBuffer.limit()];  
                        ioBuffer.get(b);
                        String msg=new String(b);
                        System.out.println("服务端反馈:["+msg+"]");
                    }
                    
                }else{
                    System.out.println("客户端发送失败");
                }
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}


3.ClientHandler.java


import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.future.WriteFuture;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

public class ClientHandler extends IoHandlerAdapter {

    @Override
    public void exceptionCaught(IoSession session, Throwable throwable)
            throws Exception {
        System.out.println("发生异常: "+throwable.getMessage());
        session.close(true);

    }

    @Override
    public void messageReceived(IoSession session, Object message) throws Exception {
        IoBuffer ioBuffer = (IoBuffer)message;  
           byte[] b = new byte[ioBuffer.limit()];  
           ioBuffer.get(b);
        
          String msg=new String(b);
        
          System.out.println("收到客户端发来的消息为" + "  " + msg);
          
          //将测试消息会送给客户端
          IoBuffer returnMsg = IoBuffer.wrap("收到".getBytes());
          WriteFuture wfutrue =session.write(returnMsg);
          wfutrue.awaitUninterruptibly();
          if(wfutrue.isWritten()){
              System.out.println("服务端回复完毕");    
          }else{
              System.out.println("服务端回复失败");
          }

    }


    @Override
    public void sessionClosed(IoSession session) throws Exception {
        System.out.println(session.getRemoteAddress() + "is Disconnection");

    }

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

    }

     /**
      * 当一个客户端连接进入时
      */
     @Override
     public void sessionOpened(IoSession session) throws Exception {

      System.out.println("incoming client: " + session.getRemoteAddress());

     }

}


=========================

客户端代码2:

1.Main.java


import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class Main {

    /**
     * 非NIO client 连接  Mina NIO server
     */
    public static void main(String[] args) {
        try {
            InetAddress ipAddress  = InetAddress.getByName("127.0.0.1");
            Socket socket = new Socket(ipAddress, 20087);
            if(socket.isConnected() && !socket.isClosed()){
                OutputStream os = socket.getOutputStream();
                DataOutputStream dos = new DataOutputStream(os);
                dos.write("hello world2".getBytes());
                dos.flush();
                
                System.out.println("C->S: 发送完毕");
                
                InputStream is = socket.getInputStream();
                DataInputStream dis = new DataInputStream(is);
                while(true){
                    byte[] bb = new byte[6];
                    dis.readFully(bb);
                    System.out.println("C<-S = "+new String(bb));
                }
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}


========================


客户端代码3:


1.Main.java


import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.channels.SocketChannel;

public class Main {

    /**
     * NIO Client 连接  Mina NIO server 测试
     */
    public static void main(String[] args) {
        try {
            SocketChannel socketChannel = SocketChannel.open();
            InetSocketAddress ia = new InetSocketAddress("127.0.0.1",20087);
            socketChannel.connect(ia);
            System.out.println("与服务器的连接建立成功");
            Socket socket = socketChannel.socket();
            if(socket.isConnected() && !socket.isClosed()){
                OutputStream os = socket.getOutputStream();
                DataOutputStream dos = new DataOutputStream(os);
                dos.write("hello world2".getBytes());
                dos.flush();
                
                System.out.println("C->S: 发送完毕");
                
                InputStream is = socket.getInputStream();
                DataInputStream dis = new DataInputStream(is);
                while(true){
                    byte[] bb = new byte[6];
                    dis.readFully(bb);
                    System.out.println("C<-S = "+new String(bb));
                }
                    
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        
    }

}


先运行服务端main.java, 再运行客户端main.java

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值