Я только вникаю в 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();
}
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Хочу сделать приложение которое бы сканировало числа и выводило их в приложениеИз библиотек я знаю Teseract, ABBYY, и Google Vision(Mobile Vision)
Cделал селектирующие лучи( получилось 6 плоскостей)необходимо теперь закрасить цветом треугольники, которые находятся внутри этой усеченной...
Хочу сразу при открытии виджета с помощью фрагмента передать данные с бдТо есть сразу будет виджет с данными