Netty 客户端,连接到服务器后停止
Netty client, stops after connection to server
我刚开始 Netty
。
目前我正在尝试向服务器发送 Object
。我在 Java
中写了一些客户端,它工作正常。我还编写了一个 Android 应用程序来接收来自服务器的消息。我试图向客户端部分添加一些用于处理 Object
s 的代码,但是出现了问题。
已连接,但未发送消息。服务器是一样的,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();
我刚开始 Netty
。
目前我正在尝试向服务器发送 Object
。我在 Java
中写了一些客户端,它工作正常。我还编写了一个 Android 应用程序来接收来自服务器的消息。我试图向客户端部分添加一些用于处理 Object
s 的代码,但是出现了问题。
已连接,但未发送消息。服务器是一样的,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();