当我运行我的 Ktor 应用程序时,gradle run我遇到了以下异常:
19:21:11.795 [main] DEBUG io.netty.util.internal.logging.InternalLoggerFactory - Using SLF4J as the default logging framework
19:21:11.810 [main] DEBUG io.netty.util.internal.PlatformDependent0 - -Dio.netty.noUnsafe: false
19:21:11.810 [main] DEBUG io.netty.util.internal.PlatformDependent0 - Java version: 11
19:21:11.811 [main] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.theUnsafe: available
19:21:11.812 [main] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.copyMemory: available
19:21:11.812 [main] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.Buffer.address: available
19:21:11.814 [main] DEBUG io.netty.util.internal.PlatformDependent0 - direct buffer constructor: unavailable
java.lang.UnsupportedOperationException: Reflective setAccessible(true) disabled
at io.netty.util.internal.ReflectionUtil.trySetAccessible(ReflectionUtil.java:31)
at io.netty.util.internal.PlatformDependent0$4.run(PlatformDependent0.java:225)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.java:219)
at io.netty.util.internal.PlatformDependent.isAndroid(PlatformDependent.java:273)
at io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:92) …Run Code Online (Sandbox Code Playgroud) 我正在研究Netty 4.0.0.Alpha5代码,以了解如何处理线程.我还在http://netty.io/wiki/new-and-noteworthy-in-4.0.html#wiki-h2-34上阅读了Netty 4新线程模型的介绍.
据我了解,目标是:
所以,我想知道我的解释是否正确.如果我是对的,那么出现以下问题:
我只是想了解为什么事情就是这样,并获得有关Netty 4设计意图的一些信息.
我相信Java的NIO库将在Linux机器上使用epoll.在Linux机器上使用Epoll而不是NIO有什么好处.
最近的TechEmpower性能基准测试已经在Netty上显示了vert.x,有时甚至是大量的.根据其网站,vert.x使用Netty作为"其大部分网络IO".如果是这样,与Netty相比,它如何实现卓越的性能?
(注意:这不是有争议的或者是火焰棒 - 我真的想知道计算机科学背后的性能差异.谢谢.)
我正在努力将设备连接到.Net(4.5.2)服务器.它是由设备打开的TCP连接,使用TLS 1.2.
SslStream通过DotNetty包装任何.Net客户端都可以使用安全的TLS连接成功连接到我的服务器.它在使用CURL时也正常工作,所以我得出结论我的TCP服务器工作正常.
所以我比较了(使用Wireshark)工作客户端发送的内容与无法连接的设备发送的内容.我发现的显着差异是客户端Hello TLS消息中缺少(对于设备)服务器名称扩展(SNI).
我接下来尝试的是使用Pcap.Net手动将数据发送到我的服务器,即使用原始字节数组手动发送TCP SYN/TCP ACK /客户端Hello消息(我从尝试连接的设备获得的原始数据(感谢Wireshark)到我的服务器).我确认通过添加服务器名称扩展来调整不工作的客户端Hello原始字节数组会导致我的TLS握手工作.
所以很明显我遇到了一个问题,那就是不包含SNI扩展的客户端和一个拒绝握手的服务器,如果这个信息不存在的话.
如何更改TCP服务器接受不提供服务器名称扩展的客户端的行为方式?是否有可能首先使用标准的.Net SslStream类?
AFAIK,SNI扩展不是强制性的,由客户决定是否使用它,因此服务器理论上应该接受没有它的客户端Hello消息.
任何指针都将非常感激.
有没有人在Netty之上构建了一个Servlet API实现?我很想建立自己的,因为我不能谷歌实施.
基本上我想支持足够的球衣工作(希望球衣不做任何线程局部的东西).
根据这本书Netty in Action v10, reference counting是用来处理汇集的ByteBuf.但是JVM并不知道netty引用计数,所以JVM仍然可以GC ByteBuf.如果是这样,为什么我们仍然需要关心引用计数和手动调用release()方法?
我引用了<Netty in Action v10>中的一些来添加一些上下文.
引用计数的权衡之一是用户在使用消息时必须小心.虽然JVM仍然能够GC这样的消息(因为它不知道引用计数),但是这个消息不会被放回到之前可能获得它的池中.因此,如果您不仔细发布这些消息,那么在某一点上您将耗尽资源的可能性很大.
还有一些相关的线程: Netty 4中的缓冲区所有权:缓冲区生命周期是如何管理的?
https://blog.twitter.com/2013/netty-4-at-twitter-reduced-gc-overhead
(以下是我的理解.)
A ByteBuf可以从2个角度分类:
1. Pooled or Unpooled
2. Heap-based or Direct
Run Code Online (Sandbox Code Playgroud)
所以可以有4种组合:
(a) Pooled Heap-based
(b) Pooled Direct
(c) Unpooled Heap-based
(d) Unpooled Direct
Run Code Online (Sandbox Code Playgroud)
只有(a)和(c)受JVM GC机制的影响,因为它们是基于堆的.
在<Netty in Action v10>的上述引文中,我认为该消息意味着一个Java对象,它位于(a)类别中.
一个最终的规则是,如果一个Java对象是GCed,它就完全消失了.以下是我认为Netty的作用:
对于(a),Netty分配器必须诱使JVM GC相信该对象永远不应该被GC.然后使用ref count将对象移出/移回池中.这是生命周期的另一种形式.
对于(b),不涉及JVM GC,因为它不是基于JVM堆的.并且Netty分配器需要使用ref计数来将对象移出/返回池中.
对于(c),JVM GC负责控制对象的生命.Netty allocator只提供分配对象的API.
对于(d),不涉及JVM GC.并且不需要汇集.所以Netty allocator只需要提供API来分配/释放对象.
我正在使用PlayFramework 2.4.6,尝试上传多部分文件(大小为18M),服务器返回以下错误:
For request 'POST /api/myEndpoint' [Request Entity Too Large]
Run Code Online (Sandbox Code Playgroud)
我环顾四周,尝试了下面的成功:
而且他们都没有解决问题.
这是Stacktrace:
Run Code Online (Sandbox Code Playgroud)14:57:33.128 [New I/O worker #2] [error] - p.c.server.netty.RequestBodyHandler - Exception caught in RequestBodyHandler java.nio.channels.ClosedChannelException: null at org.jboss.netty.channel.socket.nio.AbstractNioWorker.setInterestOps(AbstractNioWorker.java:506) [netty-3.10.4.Final.jar:na] at org.jboss.netty.channel.socket.nio.AbstractNioWorker$1.run(AbstractNioWorker.java:455) [netty-3.10.4.Final.jar:na] at org.jboss.netty.channel.socket.ChannelRunnableWrapper.run(ChannelRunnableWrapper.java:40) [netty-3.10.4.Final.jar:na] at org.jboss.netty.channel.socket.nio.AbstractNioSelector.processTaskQueue(AbstractNioSelector.java:391) [netty-3.10.4.Final.jar:na] at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:315) [netty-3.10.4.Final.jar:na] at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:89) [netty-3.10.4.Final.jar:na] at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) [netty-3.10.4.Final.jar:na] at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) [netty-3.10.4.Final.jar:na] at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) [netty-3.10.4.Final.jar:na] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_65] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_65] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_65]
我有一个netty频道,我想在底层套接字上设置一个超时(它默认设置为0).
超时的目的是,如果15分钟内没有发生任何事情,将关闭未使用的频道.
虽然我没有看到任何配置这样做,并且套接字本身也对我隐藏.
谢谢
我正在使用netty 4.0.24.Final.
我需要以编程方式启动/停止netty服务器.
启动服务器时,线程被阻止
f.channel().closeFuture().sync()
请帮助提供一些提示如何正确执行此操作.下面是Main类调用的EchoServer.谢谢.
package nettytests;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
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.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
public class EchoServer {
private final int PORT = 8007;
private EventLoopGroup bossGroup;
private EventLoopGroup workerGroup;
public void start() throws Exception {
// Configure the server.
bossGroup = new NioEventLoopGroup(1);
workerGroup = new NioEventLoopGroup(1);
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 …Run Code Online (Sandbox Code Playgroud)