问题列表及解决方式
在Netty中,客户端发送消息的地方
在Connect过程中
1、目前可以在active中,即TCP链路建立好之后进行发送。
2、在read中,对服务端消息处理之后,进行发送
3、单独进行发送,理解最好是通信框架与发送消息的框架隔离开。
blocksend是作为一个客户端单独发消息的,在李林锋的上,Netty进阶之路书中有描述。
在Connect执行之后
在main函数中,在执行Connect之后,取到connect结果生成的future--channel---eventloop--promise
如可以采用Tomcat或者SpringBoot 启动这个线程,然后接受用户请求。
用户请求是否可以单独进行扩展?
Netty类似与一个消息中间件来进行处理启动
估计Netty可以代替Tomcat接受Socket的请求,把它变为Http的协议栈。
同时,Netty应该也可以被Tomcat启动,它的地位被调整为进程之间的消息中间件的内容,如Netty本身应该可以作为消息中间件。
问题
在TCP链接状态下,客户端如果要主动关闭,如何操作,服务端会如何影响?
HttpServerCodec是否设置了心跳链接?否则是如何知道客户端关闭,然后收到一个异常的呢?
TCP的4次挥手的含义?是否在KeepAlive是默认的设置?
如果在KeepAlive状态下,客户端关闭链接,正常关闭,异常关闭。服务端会做什么响应?
TCP链接的状态值有哪些?
Wireshark是开源软件,可以免费下载使用。
1秒=1000毫秒
https://blog.csdn.net/shenya1314/article/details/70187767
socket之KEEPALIVE机制与原理分析
如果是一方正常关闭,应该有四次挥手的过程
如果一方是异常关闭,那么久需要Keepalive的机制,定时检查读,写或空闲idea
https://ssh-2009-126-com.iteye.com/blog/2109589
int keepAlive = 1; // 开启keepalive属性. 缺省值: 0(关闭)
int keepIdle = 60; // 如果在60秒内没有任何数据交互,则进行探测. 缺省值:7200(s) ,2个小时
int keepInterval = 5; // 探测时发探测包的时间间隔为5秒. 缺省值:75(s)
int keepCount = 2; // 探测重试的次数. 全部超时则认定连接失效..缺省值:9(次)
在TCP如果没有设置Keepalive情况下
如果客户端正常关闭,服务端是没有感知,测试的例子是Nettybook中的第二章bio的部分,但是感觉它的服务端没有正常释放socket,会导致服务端的socket的积压。
如果客户端非正常关闭,服务端也没有感知,测试的例子,Nettybook中的第二章bio的部分TimeClientShutDownwithoutexpect
在一个空闲的(idle)TCP连接上,没有任何的数据流,许多TCP/IP的初学者都对此感到惊奇。也就是说,如果TCP连接两端没有任何一个进程在向对方发送数据,那么在这两个TCP模块之间没有任何的数据交换。你可能在其它的网络协议中发现有轮询(polling),但在TCP中它不存在。言外之意就是我们只要启动一个客户端进程,同服务器建立了TCP连接,不管你离开几小时,几天,几星期或是几个月,连接依旧存在。中间的路由器可能崩溃或者重启,电话线可能go down或者back up,只要连接两端的主机没有重启,连接依旧保持建立。https://www.cnblogs.com/youxin/p/4056041.html
如果服务端一直在写,但是客户端关闭。这个时候会出现
如果一端的Socket被关闭(或主动关闭,或因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。,需要debug那个最简单的程序看一下,好像也没有发送?
另外,设置keepalive的功能在哪个地方设置。这个不是keepalive功能关注的内容,因为是有一个一端还在发数据的原因导致的。
Keepalive,如果设置一端为true,另外一端为false,或者2着的时间不一样,那么情况会如何?
推断:如果server设置keepalive 5分钟,那么服务器就5分钟发消息给客户端。如果正常,服务器socket保留,否则从队列中del
如果client设置keepalive10分钟,那么客户端就10分钟发消息给服务器,如果正常收到,那么client的socket就保留,否则在客户端从队列中del。
在BIO的状态下,第二个并发过来的如果超过线程的调度速度,那么就会进行在线程中排队。如果线程满,那么就会溢出。
那么如何保证用户接入不溢出呢?
问题:在netty的upgrade书中,第4章,是什么原因导致服务器知道 客户端的socket被关闭?
在服务端发送给已经关闭的客户端,出现异常
在服务器读取已经关闭的客户端,也出现异常,及时是读取自己的缓冲,但是这个读的动作,可能在底层与客户端进行了沟通。导致出现异常
如果服务器没有给对这个socket进行读数据,那么就不会报异常。然后Keepalive到期之后,发送给客户端,然后出现异常,然后进行关闭服务器的内容。
我在猜想:Netty 读缓冲的应该读的是自己的内容。应该不会出现异常的问题
InputStream is = socket.getInputStream();
is.read(bytes) > -1
会报异常
IdleStateHandler
Netty书中私有协议处理的时候,是在应用层的处理的心跳
可变数组参数。用...的话,传参数时可传可不传,传的话,可以是一个个并列地传,也可以直接是一个数组。在方法里取时,filters是一个对象数组,如果调用时什么都没有传,那么filters的长度就是0。传的时候传了几个,filters的长度就是几。还有,1.5以上才支持这个功能。
Filter... filters表示可变对象数组,Filter[] filter
比如String...str,表示可变字符串数组,String[] str
https://blog.csdn.net/bigtree_3721/article/details/51296064
JAVA 中无锁的线程安全整数 AtomicInteger介绍和使用
/**
* 来看AtomicInteger提供的接口。
//获取当前的值
public final int get()
//取当前的值,并设置新的值
public final int getAndSet(int newValue)
//获取当前的值,并自增
public final int getAndIncrement()
//获取当前的值,并自减
public final int getAndDecrement()
//获取当前的值,并加上预期的值
public final int getAndAdd(int delta)
---------------------
作者:大树叶
来源:CSDN
原文:https://blog.csdn.net/bigtree_3721/article/details/51296064
版权声明:本文为博主原创文章,转载请附上博文链接!