Изменить клиент и обработчик с DatagramPacket на POJO

Я хочу изменить обработчик клиента для использования Foo вместо Datagram - какие изменения необходимы в самом клиенте?

Конечно, нет необходимости строго придерживаться датаграмм для отправки и получения с Netty? Пример Factorial использует BigInteger, так что, конечно, можно использовать POJO.

Любые попытки создать класс, такой как:

class FooClientHandler extends SimpleChannelInboundHandler<Foo> для меня это просто не начало, оно буквально не будет отправлять или получать с сервера. (Да, и клиент, и сервер используют одинаковые обработчики, общие классы с FooИтак, сейчас я подхожу к этому из рабочего кода.

В чем основное различие между обработчиком факториала и обработчиком дейтаграммы ниже? Или главное отличие в том, как оно используется в клиенте?

клиент:

package net.bounceme.dur.netty;

import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.DatagramPacket;
import io.netty.channel.socket.nio.NioDatagramChannel;
import io.netty.util.CharsetUtil;
import java.net.InetSocketAddress;
import java.util.logging.Logger;
import net.bounceme.dur.client.gui.MyProps;

public final class Client {

    private static final Logger log = Logger.getLogger(Client.class.getName());

    public void connect() throws InterruptedException {
        MyProps p = new MyProps();
        String host = p.getHost();
        int port = p.getServerPort();
        pingPongDatagram(host, port);
    }

    public void pingPongDatagram(String host, int port) throws InterruptedException {
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(group)
                    .channel(NioDatagramChannel.class)
                    .option(ChannelOption.SO_BROADCAST, true)
                    .handler(new DatagramClientHandler());
            Channel ch = b.bind(0).sync().channel();
            ch.writeAndFlush(new DatagramPacket(
                    Unpooled.copiedBuffer("QOTM?", CharsetUtil.UTF_8),
                    new InetSocketAddress(host, port))).sync();
            log.info("wrote packet");
            if (!ch.closeFuture().await(5000)) {
                log.warning("server timed out");
            }
        } finally {
            group.shutdownGracefully();
        }
    }
}

обработчик:

package net.bounceme.dur.netty;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket;
import io.netty.util.CharsetUtil;
import java.net.InetSocketAddress;
import java.util.logging.Logger;

public class DatagramClientHandler extends SimpleChannelInboundHandler<DatagramPacket> {

    private static final Logger log = Logger.getLogger(DatagramClientHandler.class.getName());

    @Override
    public void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception {
        String response = msg.content().toString(CharsetUtil.UTF_8);
        log.info(response);
        DatagramPacket foo = new DatagramPacket(
                Unpooled.copiedBuffer("QOTM?", CharsetUtil.UTF_8),
                new InetSocketAddress("localhost", 4454));
        ctx.writeAndFlush(foo);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        log.severe(cause.toString());
        ctx.close();
    }
}

Я пропустил код сервера, он почти такой же, как в примере с цитатой Ганди.

Какие изменения мне нужно внести в клиент, чтобы обработчик мог использовать Foo вместо DatagramPacket?

1 ответ

Все, что я могу с уверенностью сказать, что этот клиент:

package net.bounceme.dur.netty;

import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.DatagramPacket;
import io.netty.channel.socket.nio.NioDatagramChannel;
import io.netty.util.CharsetUtil;
import java.net.InetSocketAddress;
import java.util.logging.Logger;
import net.bounceme.dur.client.gui.MyProps;
import net.bounceme.dur.client.jdbc.Title;

public final class Client {

    private static final Logger log = Logger.getLogger(Client.class.getName());

    public void connect() throws InterruptedException {
        MyProps p = new MyProps();
        String host = p.getHost();
        int port = p.getServerPort();
        pingPongDatagram(host, port);
    }

    public void pingPongDatagram(String host, int port) throws InterruptedException {
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(group)
                    .channel(NioDatagramChannel.class)
                    .option(ChannelOption.SO_BROADCAST, true)
                    .handler(new TitleClientHandler());
            Channel ch = b.bind(0).sync().channel();
            ch.writeAndFlush(new DatagramPacket(
                    Unpooled.copiedBuffer("QOTM?", CharsetUtil.UTF_8),
                    new InetSocketAddress(host, port))).sync();
            ch.writeAndFlush(new Title());
            log.info("wrote packets");
            if (!ch.closeFuture().await(5000)) {
                log.warning("server timed out");
            }
        } finally {
            group.shutdownGracefully();
        }
    }
}

и обработчик:

package net.bounceme.dur.netty;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import java.util.logging.Logger;
import net.bounceme.dur.client.jdbc.Title;

public class TitleClientHandler extends SimpleChannelInboundHandler<Title> {

    private static final Logger log = Logger.getLogger(TitleClientHandler.class.getName());

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        log.severe(cause.toString());
        ctx.close();
    }

    @Override
    protected void channelRead0(ChannelHandlerContext chc, Title title) throws Exception {
        log.info(title.toString());
    }
}

По-видимому, вообще не общайтесь с сервером - даже если сервер был соответствующим образом модифицирован.

Другие вопросы по тегам