網(wǎng)站首頁 編程語言 正文
SO_LINGER
SO_LINGER是一個Socket選項,它決定一個Socket關閉時的行為,因此配在server端配置的時候使用childOption配置,該選項針對每個連接配置生效,而不是全局性的配置。
該配置主要在阻塞IO的關閉場景下用的更多,當然,對于非阻塞式IO這個也是同樣可以使用的,畢竟是針對socket的關閉行為,但是實際意義有限。
該參數(shù)指定了關閉時的超時時間,當SO_LINGER設置為0時,表示禁用SO_LINGER,關閉Socket后立即返回,內(nèi)核丟棄套接字發(fā)送隊列中的數(shù)據(jù),并發(fā)送TCP RST。這種行為經(jīng)常被稱為“硬關閉”。
當SO_LINGER設置為非零正整數(shù)時,當Socket關閉時將等待所有數(shù)據(jù)都已發(fā)送或超時到達所指定的超時值。如果要發(fā)送的數(shù)據(jù)與指定的超時時間相比較,那么將立即返回。
在Netty中,SO_LINGER選項默認設置為-1,它采用操作系統(tǒng)默認行為。在大多數(shù)情況下,使用操作系統(tǒng)默認行為即可,但在某些特殊情況下可能需要調(diào)整此選項,例如在需要確保所有數(shù)據(jù)已經(jīng)發(fā)送的應用程序中。
配置示例
bootstrap = new ServerBootstrap().group(bossGroup, workerGroup)
.channel(NettyUtils.nioOrEpollServerSocketChannel())
.childOption(ChannelOption.SO_LINGER, -1)
.childOption(NioChannelOption.SO_LINGER, -1)
如示例代碼,有兩種配置方式,使用ChannelOption.SO_LINGER或者NioChannelOption.SO_LINGER。
這兩種方式的主要區(qū)別在代碼:io.netty.channel.socket.nio.NioServerSocketChannel的內(nèi)部類:NioServerSocketChannelConfig有setOption方法:
@Override
public <T> boolean setOption(ChannelOption<T> option, T value) {
if (PlatformDependent.javaVersion() >= 7 && option instanceof NioChannelOption) {
return NioChannelOption.setOption(jdkChannel(), (NioChannelOption<T>) option, value);
}
return super.setOption(option, value);
}
如果java版本大于等于7并且是NioChannelOption最終會調(diào)用jdk的設置方式。
實際上這個地方區(qū)別對于這個參數(shù)的配置結果都是一樣的,沒有區(qū)別,可以隨便選擇一種方式。
不建議使用
在非阻塞IO下,SO_LINGER選項的作用有限。因為在非阻塞IO中,寫操作通常是異步的,即數(shù)據(jù)被發(fā)送到緩沖區(qū)后就會立即返回,不會等待數(shù)據(jù)被傳輸?shù)侥繕藱C器。因此,關閉套接字時如果設置了SO_LINGER選項,也不會等待所有未發(fā)送的數(shù)據(jù)發(fā)送完畢,因為已經(jīng)無法確保所有數(shù)據(jù)都被發(fā)送出去了。
在Netty中,如果設置了SO_LINGER選項,在使用非阻塞IO時可能會導致套接字無法正確關閉,從而導致資源泄露。因此,在Netty中,我們通常不會使用SO_LINGER選項,而是使用Netty提供的優(yōu)雅關閉機制,即調(diào)用Channel.close()方法并在關閉前等待所有數(shù)據(jù)發(fā)送完畢。
需要注意的是,在某些特殊情況下,SO_LINGER選項仍然有用。比如在使用TCP連接池等技術時,可能會出現(xiàn)連接池中的連接狀態(tài)不同步的問題,此時可能需要使用SO_LINGER選項來確保所有數(shù)據(jù)被發(fā)送完畢,從而避免數(shù)據(jù)丟失或者連接不同步的問題。
注意事項
- SO_LINGER選項只對關閉套接字時的行為有影響,對于讀寫操作沒有任何影響。
- SO_LINGER選項默認是禁用的,如果要啟用需要手動設置。
- SO_LINGER選項的值為-1時,表示關閉套接字時將等待所有未發(fā)送的數(shù)據(jù)發(fā)送完畢,直到超時或數(shù)據(jù)全部發(fā)送完畢。
- SO_LINGER選項的值為0時,表示關閉套接字時將立刻關閉套接字,已發(fā)送但未被確認的數(shù)據(jù)將被丟棄。
- SO_LINGER選項的值大于0時,表示關閉套接字時將等待指定的時間,以確保數(shù)據(jù)被發(fā)送完畢。
- 在使用SO_LINGER選項時需要注意超時時間的設置,避免出現(xiàn)無法關閉套接字的情況,從而導致資源泄漏。
原文鏈接:https://blog.csdn.net/x763795151/article/details/130114960
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2023-04-07 Python實現(xiàn)SVM支持向量機的示例代碼_python
- 2022-04-18 python?request?post?列表的方法詳解_python
- 2023-01-14 C#實現(xiàn)啟動項管理的示例代碼_C#教程
- 2022-04-09 一起來了解python的if流程控制_python
- 2022-07-13 數(shù)據(jù)結構之冒泡排序
- 2023-01-28 python中使用redis用法詳解_Redis
- 2022-05-23 Android利用Palette實現(xiàn)提取圖片顏色_Android
- 2023-02-15 Python函數(shù)常見幾種return返回值類型_python
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支