netty4 能不能运行在android上

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了netty4 能不能运行在android上相关的知识,希望对你有一定的参考价值。

参考技术A 相比Netty3, Netty4有很多显著的变化:
NioEventLoopGroup 是一个处理I/O操作的多线程事件环。即为Netty4里的线程池,在3.x里,一个Channel是由ChannelFactory创建的,同时新创建的Channel会自动注册到一个隐藏的I/O线程。 4.0使用新的名为EventLoopGroup的接口来替换ChannelFactory,它由一个或多个EventLoop来构成。一个新的 Channel不会自动注册到EventLoopGroup,但用户可以显式调用EventLoopGroup.register()来注册。在Server端的Bootstrap参数中,有两个EventLoopGroup,第一个通常称为'boss',用于接收发来的连接请求。第二个称为'worker',,用于处理boss接受并且注册给worker的连接中的信息。

ChannelInitializer是一个特殊的handler,用于方便的配置用户自定义的handler实现,如代码中所示。在channelRegistered的生命周期中会触发用户复写的initChannel(C ch)方法,并且在调用后会讲自身从channelPipeline中移除。
代码示例
?
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioserverSocketChannel;
import io.netty.handler.codec.serialization.ClassResolvers;
import io.netty.handler.codec.serialization.ObjectDecoder;
import io.netty.handler.codec.serialization.ObjectEncoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.util.SelfSignedCertificate;

/**
* DateTime: 2015年1月5日 上午9:56:10
*
*/
public class HelloWorldServer
static final boolean SSL = System.getProperty("ssl") != null;
static final int PORT = Integer.parseInt(System.getProperty("port", "8007"));

public static void main(String[] args) throws Exception
// Configure SSL.
final SslContext sslCtx;
if (SSL)
SelfSignedCertificate ssc = new SelfSignedCertificate();
sslCtx = SslContext.newServerContext(ssc.certificate(), ssc.privateKey());
else
sslCtx = null;


// Configure the server.
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup();
try
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 100)
.handler(new LoggingHandler(LogLevel.INFO))
.childHandler(new ChannelInitializer<SocketChannel>()
@Override
public void initChannel(SocketChannel ch) throws Exception
ChannelPipeline p = ch.pipeline();
if (sslCtx != null)
p.addLast(sslCtx.newHandler(ch.alloc()));

p.addLast(new LoggingHandler(LogLevel.INFO));
p.addLast(
new ObjectEncoder(),
new ObjectDecoder(ClassResolvers.cacheDisabled(null)),
new HelloWorldServerHandler());

);

// Start the server.
ChannelFuture f = b.bind(PORT).sync();

// Wait until the server socket is closed.
f.channel().closeFuture().sync();
finally
// Shut down all event loops to terminate all threads.
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();




class HelloWorldServerHandler extends ChannelInboundHandlerAdapter

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg)
ctx.write("server write msg:"+msg);


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


@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
// Close the connection when an exception is raised.
cause.printStackTrace();
ctx.close();


import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.serialization.ClassResolvers;
import io.netty.handler.codec.serialization.ObjectDecoder;
import io.netty.handler.codec.serialization.ObjectEncoder;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;

/**
* DateTime: 2015年1月5日 上午9:56:22
*
*/
public class HelloWorldClient
static final boolean SSL = System.getProperty("ssl") != null;
static final String HOST = System.getProperty("host", "127.0.0.1");
static final int PORT = Integer.parseInt(System.getProperty("port", "8007"));

public static void main(String[] args) throws Exception
// Configure SSL.git
final SslContext sslCtx;
if (SSL)
sslCtx = SslContext.newClientContext(InsecureTrustManagerFactory.INSTANCE);

else
sslCtx = null;


// Configure the client.
EventLoopGroup group = new NioEventLoopGroup();
try
Bootstrap b = new Bootstrap();
b.group(group).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true)
.handler(new ChannelInitializer<SocketChannel>()
@Override
public void initChannel(SocketChannel ch) throws Exception
ChannelPipeline p = ch.pipeline();
if (sslCtx != null)
p.addLast(sslCtx.newHandler(ch.alloc(), HOST, PORT));

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

);

// Start the client.
ChannelFuture f = b.connect(HOST, PORT).sync();

// Wait until the connection is closed.
f.channel().closeFuture().sync();

finally
// Shut down the event loop to terminate all threads.
group.shutdownGracefully();




class HelloWorldClientHandler extends ChannelInboundHandlerAdapter

private final String msg = "hello java world";

/**
* Creates a client-side handler.
*/
public HelloWorldClientHandler()
//TODO


@Override
public void channelActive(ChannelHandlerContext ctx)
ctx.writeAndFlush(msg);


@Override
public void channelRead(ChannelHandlerContext ctx, Object msg)
System.out.println(msg);
// ctx.write(msg);


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


@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
// Close the connection when an exception is raised.
cause.printStackTrace();
ctx.close();

在 Linux 和 Windows 上运行的 netty 的区别

【中文标题】在 Linux 和 Windows 上运行的 netty 的区别【英文标题】:difference between netty running on Linux and Windows 【发布时间】:2020-05-12 16:37:41 【问题描述】:

Netty的I/O复用在Linux系统上依赖于epoll,但是在Windows操作系统上运行netty的性能是一样的吗?

没有epoll的windows,netty是如何工作的?iocp?

感谢您的回答。

【问题讨论】:

【参考方案1】:

这样想: 默认情况下,Netty 使用独立于您运行的操作系统的 Java NIO。 但是,通过利用本机支持(例如 Linux 的 epoll 或 macos 的 kqueue)可以获得额外的性能和一些功能。 到目前为止,Netty for Windows 还没有原生的增强,但是基本的 java NIO 仍然可以很好地服务,并且 NIO 不依赖于 epoll。

【讨论】:

以上是关于netty4 能不能运行在android上的主要内容,如果未能解决你的问题,请参考以下文章

如何在真实设备上运行 Android 应用程序?

在 android for windows 上运行 kivy

是否可以在不做任何更改的情况下在 Android 手机中运行 JavaFX 桌面应用程序? [复制]

java.lang.NoSuchMethodError public default void android.content.ServiceConnection.onBindingDied(andr

React-Native Expo,Facebook 登录无法在 Android 设备上运行

hornor8改user模式为debug模式