1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.example.http.websocketx.client;
17
18 import io.netty.bootstrap.Bootstrap;
19 import io.netty.buffer.Unpooled;
20 import io.netty.channel.Channel;
21 import io.netty.channel.ChannelInitializer;
22 import io.netty.channel.ChannelPipeline;
23 import io.netty.channel.EventLoopGroup;
24 import io.netty.channel.MultiThreadIoEventLoopGroup;
25 import io.netty.channel.nio.NioIoHandler;
26 import io.netty.channel.socket.SocketChannel;
27 import io.netty.channel.socket.nio.NioSocketChannel;
28 import io.netty.handler.codec.http.DefaultHttpHeaders;
29 import io.netty.handler.codec.http.HttpClientCodec;
30 import io.netty.handler.codec.http.HttpObjectAggregator;
31 import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame;
32 import io.netty.handler.codec.http.websocketx.PingWebSocketFrame;
33 import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
34 import io.netty.handler.codec.http.websocketx.WebSocketClientHandshakerFactory;
35 import io.netty.handler.codec.http.websocketx.WebSocketFrame;
36 import io.netty.handler.codec.http.websocketx.WebSocketVersion;
37 import io.netty.handler.codec.http.websocketx.extensions.compression.WebSocketClientCompressionHandler;
38 import io.netty.handler.ssl.SslContext;
39 import io.netty.handler.ssl.SslContextBuilder;
40 import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
41
42 import java.io.BufferedReader;
43 import java.io.InputStreamReader;
44 import java.net.URI;
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 public final class WebSocketClient {
60
61 static final String URL = System.getProperty("url", "ws://127.0.0.1:8080/websocket");
62
63 public static void main(String[] args) throws Exception {
64 URI uri = new URI(URL);
65 String scheme = uri.getScheme() == null? "ws" : uri.getScheme();
66 final String host = uri.getHost() == null? "127.0.0.1" : uri.getHost();
67 final int port;
68 if (uri.getPort() == -1) {
69 if ("ws".equalsIgnoreCase(scheme)) {
70 port = 80;
71 } else if ("wss".equalsIgnoreCase(scheme)) {
72 port = 443;
73 } else {
74 port = -1;
75 }
76 } else {
77 port = uri.getPort();
78 }
79
80 if (!"ws".equalsIgnoreCase(scheme) && !"wss".equalsIgnoreCase(scheme)) {
81 System.err.println("Only WS(S) is supported.");
82 return;
83 }
84
85 final boolean ssl = "wss".equalsIgnoreCase(scheme);
86 final SslContext sslCtx;
87 if (ssl) {
88 sslCtx = SslContextBuilder.forClient()
89 .trustManager(InsecureTrustManagerFactory.INSTANCE).build();
90 } else {
91 sslCtx = null;
92 }
93
94 EventLoopGroup group = new MultiThreadIoEventLoopGroup(NioIoHandler.newFactory());
95 try {
96
97
98
99 final WebSocketClientHandler handler =
100 new WebSocketClientHandler(
101 WebSocketClientHandshakerFactory.newHandshaker(
102 uri, WebSocketVersion.V13, null, true, new DefaultHttpHeaders()));
103
104 Bootstrap b = new Bootstrap();
105 b.group(group)
106 .channel(NioSocketChannel.class)
107 .handler(new ChannelInitializer<SocketChannel>() {
108 @Override
109 protected void initChannel(SocketChannel ch) {
110 ChannelPipeline p = ch.pipeline();
111 if (sslCtx != null) {
112 p.addLast(sslCtx.newHandler(ch.alloc(), host, port));
113 }
114 p.addLast(
115 new HttpClientCodec(),
116 new HttpObjectAggregator(8192),
117 WebSocketClientCompressionHandler.INSTANCE,
118 handler);
119 }
120 });
121
122 Channel ch = b.connect(uri.getHost(), port).sync().channel();
123 handler.handshakeFuture().sync();
124
125 BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
126 while (true) {
127 String msg = console.readLine();
128 if (msg == null) {
129 break;
130 } else if ("bye".equals(msg.toLowerCase())) {
131 ch.writeAndFlush(new CloseWebSocketFrame());
132 ch.closeFuture().sync();
133 break;
134 } else if ("ping".equals(msg.toLowerCase())) {
135 WebSocketFrame frame = new PingWebSocketFrame(Unpooled.wrappedBuffer(new byte[] { 8, 1, 8, 1 }));
136 ch.writeAndFlush(frame);
137 } else {
138 WebSocketFrame frame = new TextWebSocketFrame(msg);
139 ch.writeAndFlush(frame);
140 }
141 }
142 } finally {
143 group.shutdownGracefully();
144 }
145 }
146 }