Кракозябры в netty

140
13 апреля 2018, 18:02

Я только вникаю в netty, могу допустить серьёзные ошибки, не бейте тапками

Я ради эксперимента написал чат, сервер и клиент. Если я напишу сообщение на русском, оно будет на русском для меня, но для других это кракозябры. Если другой человек напишет сообщение на русском, то вместо текста будет вопрос(-ы).

Запись/Чтение строк из ByteBuffer'а

private ByteBuf buffer;
public String readString() {
    int len = readInt();
    byte[] bytes = readBytes(len);
    return new String(bytes);
}
public void writeBytes(byte[] bytes) {
    buffer.writeBytes(bytes);
}
public byte[] readBytes(int len) {
    byte[] b = new byte[len];
    buffer.readBytes(b);
    return b;
}
public void writeString(String s) {
    byte[] bytes = s.getBytes();
    writeInt(bytes.length);
    writeBytes(bytes);
}

Часть кода из контроллера

 //chatArea => TextFlow[JavaFX 8]
 public void appendText(String text, String image) {
    Platform.runLater(() -> {
        Text textObj = new Text(text);
        if(!image.equals("null")) { //image не может быть null, но может быть "null"
            ImageView view = new ImageView(SwingFXUtils.toFXImage(ImageCache.getCache(image).getImage(), null));
            chatArea.getChildren().addAll(textObj, view);
        } else {
            chatArea.getChildren().add(textObj);
        }
        chatArea.getChildren().add(new Text("\n"));
    });
}

Часть кода из клиента

public static void handleChat(String text, String image) {
    ChatController.getController().appendText(text, image);
}
public static void handlePacket(Packet packet, Channel channel) {
    {...}
    if(packet instanceof OutMessagePacket) {
        OutMessagePacket messagePacket = (OutMessagePacket) packet;
        handleChat(messagePacket.getMessage(), messagePacket.getImage());
    }
}

Скриншотов к сожалению нет.

Надеюсь этого будет достаточно.

Update: + ещё код

Хандлер на стороне клиента

public static class ClientHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        PacketManager.readPacket(Side.OUT, ctx.channel(), (ByteBuf) msg);
    }
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}

Хандлер на стороне сервера.

public static class ServerHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        PacketManager.readPacket(Side.IN, ctx.channel(), (ByteBuf) msg);
    }
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        User user = fromChannel(ctx.channel());
        if(user != null) {
            handleDisconnect(users.remove(user.getName()));
        }
        cause.printStackTrace();
        ctx.close();
    }
}

Чтение пакета (PacketManager::readPacket)

public static void readPacket(Side side, Channel channel, ByteBuf buf) {
    PacketBuffer packetBuffer = new PacketBuffer(buf);
    try {
        int id = packetBuffer.readInt();
        Constructor<? extends Packet> packetConstructor = packets.get(id);
        if(packetConstructor == null) {
            System.out.println("Unknown packet id:" + id);
            return;
        }
        Packet packet = packetConstructor.newInstance();
        packet.read(packetBuffer);
        switch (side) {
            case IN: {
                Server.PacketHandler.handlePacket(packet, channel);
                break;
            }
            case OUT: {
                Client.PacketHandler.handlePacket(packet, channel);
                break;
            }
        }
    } catch (InstantiationException | InvocationTargetException | IllegalAccessException e) {
        e.printStackTrace();
    }
    packetBuffer.getBuffer().release();
}
READ ALSO
Как работать с OCR библиотекой Google Vision(Mobile Vision)

Как работать с OCR библиотекой Google Vision(Mobile Vision)

Хочу сделать приложение которое бы сканировало числа и выводило их в приложениеИз библиотек я знаю Teseract, ABBYY, и Google Vision(Mobile Vision)

174
Выделить полигоны, попавшие во фрустум в шейдере

Выделить полигоны, попавшие во фрустум в шейдере

Cделал селектирующие лучи( получилось 6 плоскостей)необходимо теперь закрасить цветом треугольники, которые находятся внутри этой усеченной...

146
Из фрагмента передать виджет с данными внесенные в адаптер

Из фрагмента передать виджет с данными внесенные в адаптер

Хочу сразу при открытии виджета с помощью фрагмента передать данные с бдТо есть сразу будет виджет с данными

127
Передача файлов NIO2

Передача файлов NIO2

Добрый день есть код

130