netty.WebSocketFrameHandler.java Source code

Java tutorial

Introduction

Here is the source code for netty.WebSocketFrameHandler.java

Source

package netty;

/*
 * Copyright 2012 The Netty Project
 *
 * The Netty Project licenses this file to you under the Apache License,
 * version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at:
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import astro.backend.server.GameServer;
import astro.backend.server.event.action.ActionEvent;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.netty.buffer.ByteBufInputStream;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.handler.codec.http.websocketx.WebSocketFrame;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Echoes uppercase content of text frames.
 */
public class WebSocketFrameHandler extends SimpleChannelInboundHandler<WebSocketFrame> {

    private static final Logger logger = LoggerFactory.getLogger(WebSocketFrameHandler.class);

    private ObjectMapper mapper;

    private GameServer gameServer;

    public WebSocketFrameHandler(GameServer gameServer, ObjectMapper objectMapper) {
        super();
        this.gameServer = gameServer;
        this.mapper = objectMapper;
    }

    public void writeToChannel(Player player, Object message) {

        try {
            player.getChannel().writeAndFlush(new TextWebSocketFrame(mapper.writeValueAsString(message)));
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }

    }

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        super.userEventTriggered(ctx, evt);

        if (evt == WebSocketServerProtocolHandler.ServerHandshakeStateEvent.HANDSHAKE_COMPLETE) {

            Player p = new Player(ctx.channel());
            gameServer.addPlayer(p);
            ChannelFuture f = ctx.channel().writeAndFlush(new TextWebSocketFrame("Hello to this server"));
        }
    }

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception {
        // ping and pong frames already handled
        //PlanetMock mock = createPlanetMock();

        logger.info("{} received {}", ctx.channel());

        if (frame instanceof TextWebSocketFrame) {
            // Send the uppercase string back.
            String request = ((TextWebSocketFrame) frame).text();
            logger.info("{} received {}", ctx.channel(), request);

            ByteBufInputStream byteBufInputStream = new ByteBufInputStream(frame.content());
            ActionEvent received = mapper.readValue(byteBufInputStream, ActionEvent.class);

            gameServer.dispatchAction(received, ctx.channel());
            //ctx.channel().writeAndFlush(new TextWebSocketFrame(mapper.writeValueAsString(mock)));
            //ctx.channel().writeAndFlush(new TextWebSocketFrame(request.toUpperCase(Locale.US)));

        } else {
            String message = "unsupported frame type: " + frame.getClass().getName();
            throw new UnsupportedOperationException(message);
        }
    }

    //TODO cleanup
    private PlanetMock createPlanetMock() {

        PlanetMock.Coordinates position = new PlanetMock.Coordinates();
        position.setX(0);
        position.setY(0);

        PlanetMock.Tile tile = new PlanetMock.Tile();
        tile.setPosition(position);
        tile.setType(PlanetMock.Tile.Type.Barren);
        List<PlanetMock.Tile> list = new ArrayList<>();
        list.add(tile);

        PlanetMock.Coordinates size = new PlanetMock.Coordinates();
        size.setX(1);
        size.setY(1);

        PlanetMock pm = new PlanetMock();
        pm.setSize(size);
        pm.setTiles(list);
        return pm;
    }
}