Created
June 16, 2016 12:31
-
-
Save volyx/5fc72fdb9a92cd78b13dafc2d0a009df to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package net.swarmdb; | |
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.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.DefaultHttpHeaders; | |
import io.netty.handler.codec.http.HttpClientCodec; | |
import io.netty.handler.codec.http.HttpObjectAggregator; | |
import io.netty.handler.codec.http.websocketx.*; | |
import io.netty.handler.ssl.SslContext; | |
import io.netty.handler.ssl.SslContextBuilder; | |
import io.netty.handler.ssl.util.InsecureTrustManagerFactory; | |
import io.netty.handler.ssl.util.SelfSignedCertificate; | |
import java.io.BufferedReader; | |
import java.io.InputStreamReader; | |
import java.net.URI; | |
public final class WebSocketClient { | |
static final String URL = System.getProperty("url", "ws://127.0.0.1:8090"); | |
public static void main(String[] args) throws Exception { | |
URI uri = new URI(URL); | |
String scheme = uri.getScheme() == null ? "ws" : uri.getScheme(); | |
final String host = uri.getHost() == null ? "127.0.0.1" : uri.getHost(); | |
final int port; | |
if (uri.getPort() == -1) { | |
if ("ws".equalsIgnoreCase(scheme)) { | |
port = 8090; | |
} else if ("wss".equalsIgnoreCase(scheme)) { | |
port = 443; | |
} else { | |
port = -1; | |
} | |
} else { | |
port = uri.getPort(); | |
} | |
if (!"ws".equalsIgnoreCase(scheme) && !"wss".equalsIgnoreCase(scheme)) { | |
System.err.println("Only WS(S) is supported."); | |
return; | |
} | |
final boolean ssl = "wss".equalsIgnoreCase(scheme); | |
final SslContext sslCtx; | |
if (ssl) { | |
sslCtx = SslContextBuilder.forClient() | |
.trustManager(InsecureTrustManagerFactory.INSTANCE).build(); | |
} else { | |
sslCtx = null; | |
} | |
EventLoopGroup group = new NioEventLoopGroup(); | |
try { | |
// Connect with V13 (RFC 6455 aka HyBi-17). You can change it to V08 or V00. | |
// If you change it to V00, ping is not supported and remember to change | |
// HttpResponseDecoder to WebSocketHttpResponseDecoder in the pipeline. | |
final WebSocketClientProtocolHandler handler = | |
new WebSocketClientProtocolHandler( | |
WebSocketClientHandshakerFactory.newHandshaker( | |
uri, WebSocketVersion.V13, null, false, new DefaultHttpHeaders())); | |
Bootstrap b = new Bootstrap(); | |
b.group(group) | |
.channel(NioSocketChannel.class) | |
.handler(new ChannelInitializer<SocketChannel>() { | |
@Override | |
protected void initChannel(SocketChannel ch) { | |
ChannelPipeline p = ch.pipeline(); | |
if (sslCtx != null) { | |
p.addLast(sslCtx.newHandler(ch.alloc(), host, port)); | |
} | |
p.addLast( | |
new HttpClientCodec(), | |
new HttpObjectAggregator(8192), | |
handler); | |
} | |
}); | |
Channel ch = b.connect(uri.getHost(), port).sync().channel(); | |
BufferedReader console = new BufferedReader(new InputStreamReader(System.in)); | |
while (true) { | |
String msg = console.readLine(); | |
if (msg == null) { | |
break; | |
} | |
WebSocketFrame frame = new TextWebSocketFrame(msg); | |
ch.writeAndFlush(frame); | |
} | |
} finally { | |
group.shutdownGracefully(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment