Java tutorial
/* * Copyright 2013-2018 Lilinfeng. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.tiger.netty.rpc.all.client; import org.tiger.netty.rpc.all.NettyConstant; import org.tiger.netty.rpc.all.codec.NettyMessageDecoder; import org.tiger.netty.rpc.all.codec.NettyMessageEncoder; import java.net.InetSocketAddress; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.timeout.ReadTimeoutHandler; /** * @author Lilinfeng * @version 1.0 * @date 2014315 */ public class NettyClient { private ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); //?NIO?CPU2? EventLoopGroup group = new NioEventLoopGroup(); public void connect(int port, String host) throws Exception { try { //Netty? Bootstrap b = new Bootstrap(); b.group(group) //Channel .channel(NioSocketChannel.class) //TCP?NIO?BIO????? //SO_TIMEOUT:??0?? //SO_SNDBUF:??? //SO_RCVBUF:? //SO_REUSEADDR:??ServerSocket???ServerSocketServerSocket?? //SO_REUSEADDR???????????? //CONNECT_TIMEOUT_MILLIS:NIO????Netty //TCP_NODELAY:?TCP_NODELAY?Nagle?Nagle .option(ChannelOption.TCP_NODELAY, true).handler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { //new LengthFieldBasedFrameDecoder(100000000,0,4,0,4) //?? //??????030 //??44 //??? //????4???? ch.pipeline().addLast(new NettyMessageDecoder(1024 * 1024, 4, 4)); ch.pipeline().addLast("MessageEncoder", new NettyMessageEncoder());//Handler ch.pipeline().addLast("readTimeoutHandler", new ReadTimeoutHandler(50)); ch.pipeline().addLast("LoginAuthHandler", new LoginAuthReqHandler()); ch.pipeline().addLast("HeartBeatHandler", new HeartBeatReqHandler()); } }); //?????NioSocketChannel? //????????????? ChannelFuture future = b.connect(new InetSocketAddress(host, port), new InetSocketAddress(NettyConstant.LOCALIP, NettyConstant.LOCAL_PORT)).sync(); future.channel().closeFuture().sync(); } finally { // ???????? executor.execute(new Runnable() { public void run() { try { TimeUnit.SECONDS.sleep(1); try { connect(NettyConstant.PORT, NettyConstant.REMOTEIP);// ??? } catch (Exception e) { e.printStackTrace(); } } catch (InterruptedException e) { e.printStackTrace(); } } }); } } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { new NettyClient().connect(NettyConstant.PORT, NettyConstant.REMOTEIP); } }