天天看點

關于Socket程式設計抛出:java.net.BindException: Address already in use: connect異常原因及處理

原因:

短時間内執行的new Socket( ) 操作過于頻繁,導緻端口被耗盡。

簡單了解為:

每一次執行new Socket( )操作時都會為該套接字随機配置設定一個本機的端口号,而本機的端口号數量是有限制的,如果頻繁地配置設定而來不及釋放就會耗盡端口資源,等到下一次再執行newSocket( ) 操作時,将再無可用端口可以配置設定,故抛出異常。

有小夥伴可能就會問了:那我每次執行new Socket( ) 操作完之後及時使用close( ),不就可以解決了?

理論上這樣子可以解決問題,但是我們必須明白

close( )操作并不能立即釋放綁定的端口

, 而是把端口設定為TIME_WAIT狀态過段時間(預設240s)才釋放,如果在這段時間内還在不斷地執行new socket( )操作仍然是會出現問題的。

解決方法:

1.在進行下一個new socket( )操作之前,等待240s(預設執行close( ) 240s之後才釋放)確定端口被真正釋放

2.利用有限的接口資源幹完要做的事。例如:假設現在有1000000條消息需要發送,按照舊方法需要循環1000000次new socket( ) 操作,一次發一條消息。新方法就是循環10000次new socket( ) 操作,一次發100條消息。