Netty 客户端,连接到服务器后停止

Netty client, stops after connection to server

我刚开始 Netty

目前我正在尝试向服务器发送 Object。我在 Java 中写了一些客户端,它工作正常。我还编写了一个 Android 应用程序来接收来自服务器的消息。我试图向客户端部分添加一些用于处理 Objects 的代码,但是出现了问题。

已连接,但未发送消息。服务器是一样的,Object也是。清单没问题。我曾多次尝试与 Java 客户和 Android 客户共进午餐。 Java 一切正常。我已经绝望了。

这是我的代码

客户

public final class ObjectEchoClient {

    public static ChannelHandlerContext ctx;
    static final String HOST = System.getProperty("host", "192.168.0.101");
    static final int PORT = Integer.parseInt(System.getProperty("port", "8080"));


    public static void startClient() throws Exception {


        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group(group)
             .channel(NioSocketChannel.class)
             .option(ChannelOption.SO_BACKLOG, 128)
             .option(ChannelOption.SO_KEEPALIVE, true) // (4)
             .handler(new ChannelInitializer<SocketChannel>() {
                @Override
                public void initChannel(SocketChannel ch) throws Exception {
                    ChannelPipeline p = ch.pipeline();

                    p.addLast(
                            new ObjectEncoder(),
                            new ObjectDecoder(ClassResolvers.cacheDisabled(null)),
                            new ObjectEchoClientHandler());
                }
             });

            // Start the connection attempt.
            b.connect(HOST, PORT).sync().channel().closeFuture().sync();


        } finally {
            group.shutdownGracefully();
        }
    }
}

Android 主活动

public class MainActivity extends Activity {
    public static UnixTime m;
    public static int id = 12345678;
    public static ChannelHandlerContext ctx;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        socketTest();

        final Button btn1 = (Button)findViewById(R.id.button1);


        btn1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                try {
                    //*
                    if(ObjectEchoClient.ctx != null)
                    { 
                        Package p = new Package();
                        p.setId(id);
                        ObjectEchoClient.ctx.writeAndFlush(p);
                    }
                    else
                    {
                        Log.e("test", "off");
                    }
                    //*/
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        });

    }
public static void socketTest()
    {
        new Thread (new Runnable() {

            @Override
            public void run() {
                try {
                    ObjectEchoClient.startClient();

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }   
            }}).start();

    }

P.S。如果我在 ObjectEchoClientHandler() 中的 channelActive 方法中向处理程序添加一些消息,它将被发送。但我需要在需要时发送它。

P.P.S亨德勒

public class ObjectEchoClientHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelActive(ChannelHandlerContext ctx) {

        ObjectEchoClient.ctx = ctx;

    }



    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {

    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
       ctx.flush();
    }

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

我在这里有点生疏但是当你打电话时:

b.connect(HOST, PORT).sync().channel().closeFuture().sync();

你不是一打开就关闭频道吗?

在活动频道上发送消息是在频道连接的短暂时间内发送,否?

我仍然是 netty3 的顽固分子,但看着这 5 个样本,您想要连接:

ChannelFuture f = b.connect(HOST, PORT).sync();

然后稍后,停止客户端:

f.channel().closeFuture().sync();

所以问题出在writeAndFlush();方法中。对于 Android,它没有正确刷新数据。所以你需要再次冲洗它。

ObjectEchoClient.ctx.writeAndFlush(p);
ctx.flush();