我刚开始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();
}
}
答案 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();