/*
* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.yangtools.websocket.client;
import com.google.common.base.Preconditions;
import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoop;
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.codec.http.HttpClientCodec;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame;
import io.netty.handler.codec.http.websocketx.PingWebSocketFrame;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.handler.codec.http.websocketx.WebSocketClientHandshakerFactory;
import io.netty.handler.codec.http.websocketx.WebSocketVersion;
import java.net.URI;
import org.opendaylight.yangtools.websocket.client.callback.ClientMessageCallback;
/**
* Implementation of web socket client that supports WS and HTTP protocols.
*
* @deprecated This code is deprecated without replacement.
*/
@Deprecated
public class WebSocketIClient {
private final EventLoopGroup group = new NioEventLoopGroup();
private final Bootstrap bootstrap = new Bootstrap();
private final WebSocketClientHandler clientHandler;
private final URI uri;
private Channel clientChannel;
/**
* Creates new web socket client
*
* @param uri
* URI
* @param clientMessageCallback
* ClientMessageCallback
*/
public WebSocketIClient(final URI uri, final ClientMessageCallback clientMessageCallback) {
this.uri = Preconditions.checkNotNull(uri);
clientHandler = new WebSocketClientHandler(
WebSocketClientHandshakerFactory.newHandshaker(uri, WebSocketVersion.V13, null, false, null),
clientMessageCallback); // last null could be replaced with DefaultHttpHeaders
initialize();
}
/**
* Initializes {@link Channel} one when it was registered to its
* {@link EventLoop}.
*/
private void initialize() {
String protocol = uri.getScheme();
if (!"ws".equals(protocol) && !"http".equals(protocol)) {
throw new IllegalArgumentException("Unsupported protocol: "
+ protocol);
}
bootstrap.group(group).channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(final SocketChannel ch) {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast("http-codec", new HttpClientCodec());
pipeline.addLast("aggregator",
new HttpObjectAggregator(8192));
pipeline.addLast("ws-handler", clientHandler);
}
});
}
/**
* Makes the connection attempt and notifies when the handshake process
* succeeds or fail.
*/
public void connect() throws InterruptedException {
clientChannel = bootstrap.connect(uri.getHost(), uri.getPort()).sync()
.channel();
clientHandler.handshakeFuture().sync();
}
/**
* Writes a String message through the
* {@link ChannelPipeline} and request to actual {@link Channel#flush()} to flush
* all pending data to the actual transport.
*
* @param message
* a message to write
*/
public void writeAndFlush(final String message) {
clientChannel.writeAndFlush(new TextWebSocketFrame(message));
}
/**
* Writes a Object message through the
* {@link ChannelPipeline} and request to actual {@link Channel#flush()} to flush
* all pending data to the actual transport.
*
* @param message
* a message to write
*/
public void writeAndFlush(final Object message) {
clientChannel.writeAndFlush(message);
}
/**
* Writes {@link PingWebSocketFrame}
* through the {@link ChannelPipeline} and request to actual
* {@link Channel#flush()} to flush all pending data to the actual transport.
*/
public void ping() {
clientChannel.writeAndFlush(new PingWebSocketFrame(Unpooled
.copiedBuffer(new byte[] { 1, 2, 3, 4, 5, 6 })));
}
/**
* Closes the connection when the server responds to the
* {@link CloseWebSocketFrame}.
*/
public void close() throws InterruptedException {
clientChannel.writeAndFlush(new CloseWebSocketFrame());
clientChannel.closeFuture().sync();
group.shutdownGracefully();
}
}