netty 3多客户端连接与心跳断开重连

netty服务端

package com.netty.test3;

import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import org.jboss.netty.handler.codec.string.StringDecoder;
import org.jboss.netty.handler.codec.string.StringEncoder;
import org.jboss.netty.handler.timeout.IdleStateHandler;
import org.jboss.netty.util.HashedWheelTimer;

import java.net.InetSocketAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by Administrator on 2018-05-16.
 */
public class Server {
    public static void main(String[] args) {
        ServerBootstrap server = new ServerBootstrap();

        ExecutorService boss = Executors.newCachedThreadPool();
        ExecutorService worker = Executors.newCachedThreadPool();
        server.setFactory(new NioServerSocketChannelFactory(boss,worker));
        final HashedWheelTimer hashedWheelTimer = new HashedWheelTimer();
        server.setPipelineFactory(new ChannelPipelineFactory() {
            public ChannelPipeline getPipeline() throws Exception {
                ChannelPipeline pipeline = Channels.pipeline();
                pipeline.addLast("idle",new IdleStateHandler(hashedWheelTimer,5,5,20));
                pipeline.addLast("decoder",new StringDecoder());
                pipeline.addLast("encoder",new StringEncoder());
                pipeline.addLast("hellohandler",new HelloHandler());
                return pipeline;
            }
        });
        server.bind(new InetSocketAddress(10101));
        System.out.println("Start!!!");
    }
}

netty服务端事件监听

package com.netty.test3;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.*;
import org.jboss.netty.handler.timeout.IdleState;
import org.jboss.netty.handler.timeout.IdleStateAwareChannelHandler;
import org.jboss.netty.handler.timeout.IdleStateEvent;

/**
 * Created by Administrator on 2018-05-17.
 */
public class HelloHandler extends IdleStateAwareChannelHandler implements ChannelHandler {
    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
        System.out.println("messageReceived");
//        ChannelBuffer message = (ChannelBuffer)e.getMessage();
//        String s = new String(message.array());
        System.out.println((String)e.getMessage());
//        ChannelBuffer copiedBuffer = ChannelBuffers.copiedBuffer("欢迎光临".getBytes());
        ctx.getChannel().write("欢迎光临");
        super.messageReceived(ctx, e);
    }

    @Override
    public void channelIdle(final ChannelHandlerContext ctx, IdleStateEvent e) throws Exception {
        if ( e.getState() == IdleState.ALL_IDLE) {
            System.out.println("踢玩家下线");
            ChannelFuture write = ctx.getChannel().write("time out,you will close");
            write.addListener(new ChannelFutureListener() {
                public void operationComplete(ChannelFuture channelFuture) throws Exception {
                    ctx.getChannel().close();
                }
            });
        }
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
        System.out.println("exceptionCaught");
        super.exceptionCaught(ctx, e);
    }

    @Override
    public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
        System.out.println("channelConnected");
        super.channelConnected(ctx, e);
    }

    @Override
    public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
        System.out.println("channelDisconnected");
        super.channelDisconnected(ctx, e);
    }

    @Override
    public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
        System.out.println("channelClosed");
        super.channelClosed(ctx, e);
    }
}

netty多客户端代码

package com.netty.test3;

import org.jboss.netty.bootstrap.ClientBootstrap;
import org.jboss.netty.channel.*;
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
import org.jboss.netty.handler.codec.string.StringDecoder;
import org.jboss.netty.handler.codec.string.StringEncoder;

import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by Administrator on 2018-05-21.
 */
public class MultClient {
    private ClientBootstrap client = new ClientBootstrap();
    private List<Channel> channels = new ArrayList<Channel>();
    private final AtomicInteger index = new AtomicInteger();
    public void init(int count) {
        ExecutorService boss = Executors.newCachedThreadPool();
        ExecutorService worker = Executors.newCachedThreadPool();
        client.setFactory(new NioClientSocketChannelFactory(boss,worker));
        client.setPipelineFactory(new ChannelPipelineFactory() {
            public ChannelPipeline getPipeline() throws Exception {
                ChannelPipeline pipeline = Channels.pipeline();
                pipeline.addLast("decoder",new StringDecoder());
                pipeline.addLast("encoder",new StringEncoder());
                pipeline.addLast("hihandler",new HiHandler());
                return pipeline;
            }
        });
        for (int i = 1;i <= count;i++) {
            ChannelFuture future = client.connect(new InetSocketAddress("127.0.0.1", 10101));
            channels.add(future.getChannel());
        }
    }
    public Channel nextChannel() {
        return getFirstActiveChannel(0);
    }
    private Channel getFirstActiveChannel(int count) {
        Channel channel;
        if (count == 0) {
            channel = channels.get(0);
        }else {
            int tmpIndex = Math.abs(index.incrementAndGet() % channels.size());
            channel = channels.get(tmpIndex);
        }
        if (!channel.isOpen()) {
            reconnect(channel);
            if (count >= channels.size()) {
                throw new RuntimeException("no can use channel");
            }
            return getFirstActiveChannel(count + 1);
        }
        return channel;
    }
    private void reconnect(Channel channel) {
        synchronized (channel) {
            if (channels.indexOf(channel) == -1) {
                return;
            }
            Channel newChannel = client.connect(new InetSocketAddress("127.0.0.1",10101)).getChannel();
            channels.set(channels.indexOf(channel),newChannel);
        }
    }
}

客户端监听

package com.netty.test3;

import org.jboss.netty.channel.*;

/**
 * Created by Administrator on 2018-05-17.
 */
public class HiHandler extends SimpleChannelHandler {
    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
        System.out.println("messageReceived");
//        ChannelBuffer message = (ChannelBuffer)e.getMessage();
//        String s = new String(message.array());
        System.out.println((String)e.getMessage());
//        ChannelBuffer copiedBuffer = ChannelBuffers.copiedBuffer("fuck".getBytes());
//        ctx.getChannel().write("fuck");
        super.messageReceived(ctx, e);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
        System.out.println("exceptionCaught");
        super.exceptionCaught(ctx, e);
    }

    @Override
    public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
        System.out.println("channelConnected");
        super.channelConnected(ctx, e);
    }

    @Override
    public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
        System.out.println("channelDisconnected");
        super.channelDisconnected(ctx, e);
    }

    @Override
    public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
        System.out.println("channelClosed");
        super.channelClosed(ctx, e);
    }
}

客户端启动程序

package com.netty.test3;

import org.jboss.netty.channel.Channel;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * Created by Administrator on 2018-05-21.
 */
public class Start {
    public static void main(String[] args) {
        MultClient client = new MultClient();
        client.init(5);
        System.out.println("Client Start");
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            try {
                System.out.println("请输入:");
                String msg = bufferedReader.readLine();
                Channel channel = client.nextChannel();
                if (channel.isConnected()) {
                    channel.write(msg);
                }else {
                    System.out.println("正在连接,请稍后...");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

猜你喜欢

转载自my.oschina.net/u/3768341/blog/1815746