netty服務端java
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服務端事件監聽bootstrap
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多客戶端代碼socket
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); } } }
客戶端監聽ide
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); } }
客戶端啓動程序atom
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(); } } } }