原因:
短時間内執行的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條消息。