将客户端和处理程序从DatagramPacket更改为POJO

时间:2014-07-27 20:15:43

标签: java sockets serialization netty datagram

我想修改客户端处理程序以使用Foo而不是Datagram - 客户端本身需要进行哪些更改?< / p>

当然,没有必要严格保持数据报与Netty一起发送和接收? Factorial example使用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();
    }
}

我省略了服务器代码,它几乎与Ghandi quote example中一样。

我需要对客户端进行哪些更改,以便处理程序可以使用Foo代替DatagramPacket

1 个答案:

答案 0 :(得分:0)

我可以肯定地说,这个客户:

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());
    }
}
似乎没有与服务器进行通信 - 即使服务器已经相应地进行了修改。