View Javadoc

    1   /*
    2    * Copyright 2012 The Netty Project
    3    *
    4    * The Netty Project licenses this file to you under the Apache License,
    5    * version 2.0 (the "License"); you may not use this file except in compliance
    6    * with the License. You may obtain a copy of the License at:
    7    *
    8    *   http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    13   * License for the specific language governing permissions and limitations
    14   * under the License.
    15   */
    16  //The MIT License
    17  //
    18  //Copyright (c) 2009 Carl Bystršm
    19  //
    20  //Permission is hereby granted, free of charge, to any person obtaining a copy
    21  //of this software and associated documentation files (the "Software"), to deal
    22  //in the Software without restriction, including without limitation the rights
    23  //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    24  //copies of the Software, and to permit persons to whom the Software is
    25  //furnished to do so, subject to the following conditions:
    26  //
    27  //The above copyright notice and this permission notice shall be included in
    28  //all copies or substantial portions of the Software.
    29  //
    30  //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    31  //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    32  //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    33  //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    34  //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    35  //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    36  //THE SOFTWARE.
    37
    38  package org.jboss.netty.example.http.websocketx.client;
    39
    40  import org.jboss.netty.channel.Channel;
    41  import org.jboss.netty.channel.ChannelHandlerContext;
    42  import org.jboss.netty.channel.ChannelStateEvent;
    43  import org.jboss.netty.channel.ExceptionEvent;
    44  import org.jboss.netty.channel.MessageEvent;
    45  import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
    46  import org.jboss.netty.handler.codec.http.HttpResponse;
    47  import org.jboss.netty.handler.codec.http.websocketx.CloseWebSocketFrame;
    48  import org.jboss.netty.handler.codec.http.websocketx.PongWebSocketFrame;
    49  import org.jboss.netty.handler.codec.http.websocketx.TextWebSocketFrame;
    50  import org.jboss.netty.handler.codec.http.websocketx.WebSocketClientHandshaker;
    51  import org.jboss.netty.handler.codec.http.websocketx.WebSocketFrame;
    52  import org.jboss.netty.util.CharsetUtil;
    53
    54  public class WebSocketClientHandler extends SimpleChannelUpstreamHandler {
    55
    56      private final WebSocketClientHandshaker handshaker;
    57
    58      public WebSocketClientHandler(WebSocketClientHandshaker handshaker) {
    59          this.handshaker = handshaker;
    60      }
    61
    62      @Override
    63      public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
    64          System.out.println("WebSocket Client disconnected!");
    65      }
    66
    67      @Override
    68      public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
    69          Channel ch = ctx.getChannel();
    70          if (!handshaker.isHandshakeComplete()) {
    71              handshaker.finishHandshake(ch, (HttpResponse) e.getMessage());
    72              System.out.println("WebSocket Client connected!");
    73              return;
    74          }
    75
    76          if (e.getMessage() instanceof HttpResponse) {
    77              HttpResponse response = (HttpResponse) e.getMessage();
    78              throw new Exception("Unexpected HttpResponse (status=" + response.getStatus() + ", content="
    79                      + response.getContent().toString(CharsetUtil.UTF_8) + ")");
    80          }
    81
    82          WebSocketFrame frame = (WebSocketFrame) e.getMessage();
    83          if (frame instanceof TextWebSocketFrame) {
    84              TextWebSocketFrame textFrame = (TextWebSocketFrame) frame;
    85              System.out.println("WebSocket Client received message: " + textFrame.getText());
    86          } else if (frame instanceof PongWebSocketFrame) {
    87              System.out.println("WebSocket Client received pong");
    88          } else if (frame instanceof CloseWebSocketFrame) {
    89              System.out.println("WebSocket Client received closing");
    90              ch.close();
    91          }
    92      }
    93
    94      @Override
    95      public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
    96          final Throwable t = e.getCause();
    97          t.printStackTrace();
    98          e.getChannel().close();
    99      }
    100 }