This commit is contained in:
crusader 2018-05-03 22:23:33 +09:00
parent 9677c63de9
commit 5091e0fa6a

View File

@ -0,0 +1,104 @@
package com.loafle.commons.server.websocket.client;
import java.net.SocketAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpClientCodec;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.websocketx.WebSocketClientHandshaker;
import io.netty.handler.codec.http.websocketx.WebSocketClientProtocolHandler;
import io.netty.handler.codec.http.websocketx.extensions.compression.WebSocketClientCompressionHandler;
/**
* Client
*/
public class Client {
private static final Logger logger = LoggerFactory.getLogger(Client.class);
public static final String CHANNEL_CLASS = "CLIENT_CHANNEL_CLASS";
public static final String CHANNEL_HANDLER = "CLIENT_CHANNEL_HANDLER";
public static final String HANDSHAKER = "CLIENT_HANDSHAKER";
public static final String SOCKET_ADDRESS = "CLIENT_SOCKET_ADDRESS";
@Autowired
@Qualifier(CHANNEL_CLASS)
protected Class<? extends Channel> channelClass;
@Autowired
@Qualifier(CHANNEL_HANDLER)
protected ChannelHandler handler;
@Autowired
@Qualifier(HANDSHAKER)
WebSocketClientHandshaker handshaker;
@Autowired
@Qualifier(SOCKET_ADDRESS)
protected SocketAddress address;
private Channel channel;
public void start() throws Exception {
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();
b.group(group);
if (null != this.channelClass) {
b = b.channel(this.channelClass);
}
b.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ChannelPipeline p = ch.pipeline();
p.addLast(
new HttpClientCodec(),
new HttpObjectAggregator(8192),
WebSocketClientCompressionHandler.INSTANCE,
new WebSocketClientProtocolHandler(handshaker, true),
handler
);
}
});
this.init();
ChannelFuture cf = b.connect(this.address);
this.onStart();
cf.sync();
this.channel = cf.channel();
} catch (Exception e) {
logger.error("Client", e);
} finally {
this.onStop();
group.shutdownGracefully();
this.destroy();
}
}
public void stop() throws Exception {
this.channel.close().sync();
}
protected void init() throws Exception {
// no op
}
protected void onStart() throws Exception {
// no op
}
protected void onStop() throws Exception {
// no op
}
protected void destroy() throws Exception {
// no op
}
}