Git Product home page Git Product logo

netty-4-user-guide-demos's Introduction

netty-4-user-guide-demos's People

Contributors

dependabot[bot] avatar mustang2247 avatar waylau avatar wj89757 avatar xenoamess avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

netty-4-user-guide-demos's Issues

netty Client 多IP

使用netty client 同时连接多个服务器,并进行消息的收发且互不干扰,大神 有封装,实现思路吗?

com.waylau.netty.demo.encoder.MyDecoder

private static final int LENGTH_FIELD_LENGTH = 1;
private static final int LENGTH_FIELD_OFFSET = 4;

根据消息帧类型,此处应该填写错误,以上两个参数应该对调。

书籍p34页错误,帮我确认是否购买的盗版书籍?

参考书籍p33页例子手敲代码,第p34页错误.

    try {
        // 启动NOI服务器的引导程序类
        ServerBootstrap b = new ServerBootstrap();
        b.group(bossGroup,workGroup)
                .channel(NioServerSocketChannel.class)
                .childHandler(new EchoServerHandler())
                .option(ChannelOption.SO_BACKLOG,128)
                .childOption(ChannelOption.SO_KEEPALIVE,true);
        ChannelFuture f = b.bind(port).sync();//未处理 异常: java.lang.InterruptedException

        f.channel().closeFuture().sync();//未处理 异常: java.lang.InterruptedException
    } finally {
            workGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
    }

这个地方为啥要唤醒两次,前面那次我知道为啥。后面那次是多余的吗?

public void run() {
SocketChannel socketChannel;
try {
socketChannel = serverSocketChannel.accept(); // 连接
if (socketChannel != null) {
System.out.println(String.format("accpet %s", socketChannel.getRemoteAddress()));
socketChannel.configureBlocking(false);

			// 注意一个selector在select时是无法注册新事件的,因此这里要先暂停下select方法触发的程序段,
			// 下面的weakup和这里的setRestart都是做这个事情的,具体参考SubReactor里的run方法
			reactors[next].registering(true);
			selectors[next].wakeup(); // 使一个阻塞住的selector操作立即返回
			SelectionKey selectionKey = 
					socketChannel.register(selectors[next], SelectionKey.OP_READ); // 注册一个读事件
			selectors[next].wakeup(); // 使一个阻塞住的selector操作立即返回

			// 本次事件注册完成后,需要再次触发select的执行,
			// 因此这里Restart要在设置回false(具体参考SubReactor里的run方法)
			reactors[next].registering(false);

			// 绑定Handler
			selectionKey.attach(new AsyncHandler(socketChannel, selectors[next], next));
			if (++next == selectors.length) {
				next = 0;    // 越界后重新分配
			}
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
}

demo异常

FactorialServer运行log:

九月 29, 2017 9:58:20 上午 io.netty.handler.logging.LoggingHandler channelRegistered
信息: [id: 0xe2ac6af8] REGISTERED
九月 29, 2017 9:58:20 上午 io.netty.handler.logging.LoggingHandler bind
信息: [id: 0xe2ac6af8] BIND(0.0.0.0/0.0.0.0:8322)
九月 29, 2017 9:58:20 上午 io.netty.handler.logging.LoggingHandler channelActive
信息: [id: 0xe2ac6af8, /0:0:0:0:0:0:0:0:8322] ACTIVE

FactorialClient运行log:
九月 29, 2017 9:58:23 上午 io.netty.channel.ChannelInitializer exceptionCaught
警告: Failed to initialize a channel. Closing: [id: 0xa5862cb9]
java.lang.NoClassDefFoundError: com/jcraft/jzlib/Inflater
at io.netty.handler.codec.compression.JZlibDecoder.(JZlibDecoder.java:27)
at io.netty.handler.codec.compression.ZlibCodecFactory.newZlibDecoder(ZlibCodecFactory.java:111)
at com.waylau.netty.demo.factorial.FactorialClientInitializer.initChannel(FactorialClientInitializer.java:31)
at com.waylau.netty.demo.factorial.FactorialClientInitializer.initChannel(FactorialClientInitializer.java:13)
at io.netty.channel.ChannelInitializer.channelRegistered(ChannelInitializer.java:68)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRegistered(AbstractChannelHandlerContext.java:133)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRegistered(AbstractChannelHandlerContext.java:119)
at io.netty.channel.DefaultChannelPipeline.fireChannelRegistered(DefaultChannelPipeline.java:733)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:450)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$100(AbstractChannel.java:378)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:424)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:358)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:357)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: com.jcraft.jzlib.Inflater
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 16 more

Exception in thread "main" java.nio.channels.ClosedChannelException

Process finished with exit code 1

使用Object编解码器后client 连接不能自动关闭

你好,我在运行codec包中的server及client过程中,启动SerializationClient 发送消息完成后,该client并没有自动关闭,代码一直挺在channel.closeFuture().sync()这里,请问下怎么样才能让该client自动关闭。运行其他工程,如echo,time则不会出现这种情况

Unable to establish loopback connection

我是java初学者,在测试netty的例子。可能是我配置上有问题,但是网络上的方法无法解决这个问题。
EchoServer demo中
new NioEventLoopGroup();时报错

Exception in thread "main" java.lang.IllegalStateException: failed to create a child event loop
at io.netty.util.concurrent.MultithreadEventExecutorGroup.(MultithreadEventExecutorGroup.java:88)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.(MultithreadEventExecutorGroup.java:58)
at io.netty.channel.MultithreadEventLoopGroup.(MultithreadEventLoopGroup.java:52)
at io.netty.channel.nio.NioEventLoopGroup.(NioEventLoopGroup.java:96)
at io.netty.channel.nio.NioEventLoopGroup.(NioEventLoopGroup.java:91)
at io.netty.channel.nio.NioEventLoopGroup.(NioEventLoopGroup.java:72)
at io.netty.channel.nio.NioEventLoopGroup.(NioEventLoopGroup.java:52)
at io.netty.channel.nio.NioEventLoopGroup.(NioEventLoopGroup.java:44)
at com.waylau.netty.demo.echo.EchoServer.main(EchoServer.java:30)
Caused by: io.netty.channel.ChannelException: failed to open a new selector
at io.netty.channel.nio.NioEventLoop.openSelector(NioEventLoop.java:175)
at io.netty.channel.nio.NioEventLoop.(NioEventLoop.java:142)
at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:146)
at io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:37)
at io.netty.util.concurrent.MultithreadEventExecutorGroup.(MultithreadEventExecutorGroup.java:84)
... 8 more
Caused by: java.io.IOException: Unable to establish loopback connection
at java.base/sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:94)
at java.base/sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:61)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:554)
at java.base/sun.nio.ch.PipeImpl.(PipeImpl.java:171)
at java.base/sun.nio.ch.SelectorProviderImpl.openPipe(SelectorProviderImpl.java:60)
at java.base/java.nio.channels.Pipe.open(Pipe.java:155)
at java.base/sun.nio.ch.WindowsSelectorImpl.(WindowsSelectorImpl.java:142)
at java.base/sun.nio.ch.WindowsSelectorProvider.openSelector(WindowsSelectorProvider.java:44)
at io.netty.channel.nio.NioEventLoop.openSelector(NioEventLoop.java:173)
... 12 more
Caused by: java.net.BindException: Cannot assign requested address: connect
at java.base/sun.nio.ch.Net.connect0(Native Method)
at java.base/sun.nio.ch.Net.connect(Net.java:574)
at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:784)
at java.base/java.nio.channels.SocketChannel.open(SocketChannel.java:224)
at java.base/sun.nio.ch.PipeImpl$Initializer$LoopbackConnector.run(PipeImpl.java:127)
at java.base/sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:76)
... 20 more

2020年12月第1版2020年12月第1次印刷勘误、改进项

内容简介

“JavaNIO”应为“Java NIO”

第一章示例加运行参数

第一章示例,client相关参数建议配置到ide当中

#18

p43

“可以通过 SelectionKey 的 selectedKeySet() 方法访问这些对象。”应为“可以通过 Selector 的 selectedKeys() 方法访问这些对象。”

参考文献

参考文献补充下面一条:

[19] 柳伟卫. 大型互联网应用轻量级架构实战[M]. 北京:北京大学出版社,2019.

2020年12月第1版 2020年12月第1次印刷 第1~3章内容建议

  • 内容简介:JavaNIO修改为Java NIO
  • 21页:此外,还可利用新的传输实现没有写入的优势,只需替换一些构造器的调用方法即可参照官方原文(Also, you are even able to take advantage of new transports which aren't yet written (such as serial port communication transport), again by replacing just a couple lines of constructor calls. Moreover, you can write your own transport by extending the core API.)修改为此外,你甚至还可以利用尚未编写的新传输(例如串口通信传输),同样,只需替换几行构造函数调用即可
  • 22页:在本节,将研究参照官方原文(In this chapter, we will examine what core functionalities are provided in Netty and how they constitute a complete network application development stack on top of the core.)建议修改为在本节,我们将研究Netty提供了哪些核心功能,以及它们是如何在核心之上构成一个完整的网络应用程序开发技术栈的
  • 31页:这样,通过一个依赖就能适用到建议修改为使用到
  • 33页:现在仅仅只需要继承ChannelInboundHandlerAdapter建议修改为现在只需要继承ChannelInboundHandlerAdapter
  • 35页:可以通过option设置建议修改为可以通过option设置特定于Channel实现的参数
  • 43页:可以通过SelectionKey的selectedKeySet方法访问这些对象建议修改为可以通过Selector的selectedKeys方法访问这些对象
  • 44页:ChannelHandler的接口建议修改为ChannelHandler的方法
  • 47页:责任链模式会定义一个抽象处理器(Handler)角色,该角色对请求进行抽象建议修改为该角色对请求处理进行抽象,或者修改为该角色对请求进行处理
  • 48页:对于入栈的请求建议修改为对于入站的请求
  • 48页:图2-4图建议修改为图2-4
  • 52页:向下转型以下访问特定于传输的操作建议修改为向下转型以访问特定于传输的操作
  • 62页:ChannelInboundHandler.fireUserEventTriggered()方法修改为ChannelInboundInvoker.fireUserEventTriggered()方法
  • 65页:ChannelInboundHandlerAdapter是ChannelInboundHandler实现的抽象基类建议修改为ChannelInboundHandlerAdapter是实现了ChannelInboundHandler的适配器类
  • 66页:ChannelOutboundHandlerAdapter是ChannelOutboundHandler实现的抽象基类建议修改为ChannelOutboundHandlerAdapter是实现了ChannelOutboundHandler的适配器类
  • 74页:headContext修改为HeadContext,并是实现了修改为并且实现了
  • 76页:上述Write()方法修改为write()方法
  • 79页:ChannelHandlerContext可以通过参照ChannelHandlerContext源码注释(Enables a ChannelHandler to interact with its ChannelPipeline and other handlers. Among other things a handler can notify the next ChannelHandler in the ChannelPipeline as well as modify the ChannelPipeline it belongs to dynamically.)建议修改为一个处理器可以通知ChannelPipeline中的下一个ChannelHandler
  • 106页:被称为EmbeddedChannel类修改为被称为EmbeddedChannel的类

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.