问题记录列表

问题列表及解决方式

在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

版权声明:本文为博主原创文章,转载请附上博文链接!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容