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

时间:2015-08-05 18:31:19

标签: java android netty

我刚开始Netty

目前我正在尝试向服务器发送Object。我在Java写了一些客户端,它运行正常。我还写了一个从服务器接收消息的Android应用程序。我尝试添加一些代码来处理Object到客户端部分,但是有一个问题。

它连接,但它不发送消息。服务器是相同的,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 MainActivity

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。如果我使用channelActive中的ObjectEchoClientHandler()方法向处理程序添加一些消息,则会发送该消息。但是我需要在需要时发送它。

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();
    }
}

2 个答案:

答案 0 :(得分:0)

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

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

你打开频道后是不是关闭频道?

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

我仍然是netty3顽固但看着5个样本,连接你想要:

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

然后,停止客户:

f.channel()closeFuture()同步();

答案 1 :(得分:0)

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

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