golangでソケットを閉じる方法(2つの方法)

PHPz
リリース: 2023-04-10 15:59:43
オリジナル
1168 人が閲覧しました

Golang では、ソケットはネットワーク通信の重要な方法です。ただし、ソケットを操作する場合、実行時のプログラムの終了や例外など、ソケットを閉じる必要がある状況が発生することがあります。この記事では、Golang でソケットを閉じるという観点からこの問題を検討します。

Golang でソケットを閉じるにはどうすればよいですか?次の 2 つの方法を使用できます。

最初の方法は、net.Conn インターフェイスの Close() メソッドを使用してソケットを閉じることです。具体的なコードは次のとおりです。

conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
    log.Fatalf("connect error: %s", err)
}

// do something with conn here

conn.Close()
ログイン後にコピー

上記のコードでは、まず Dial() メソッドを通じて指定されたアドレスに接続し、次に Close() メソッドを通じて接続を閉じます。接続を手動で閉じないと、Go プログラムは終了時に自動的に閉じられることに注意してください。

2 番目の方法は、net.Listen() メソッドによって返される Listener インターフェイスの Close() メソッドを使用してソケットを閉じることです。具体的なコードは次のとおりです。

listener, err := net.Listen("tcp", "127.0.0.1:8080")
if err != nil {
    log.Fatalf("listen error: %s", err)
}

// do something with listener here

listener.Close()
ログイン後にコピー

上記のコードでは、まず Listen() メソッドを通じてリスナーを作成し、次に Close() メソッドを通じてリスナーを閉じます。リスナーを手動で閉じない場合、Go プログラムはプログラムの終了時に自動的に閉じられることに注意してください。

それでは、上記の 2 つの方法以外にソケットを閉じる方法はあるのかと疑問に思うかもしれません。実際、上記の 2 つの方法で十分にニーズを満たすことができます。さらに、最初のメソッド、つまり Listen() メソッドの代わりに Dial() メソッドを使用している場合は、タイムアウトを設定して接続を閉じることも可能です。具体的なコードは次のとおりです。

conn, err := net.DialTimeout("tcp", "127.0.0.1:8080", time.Second*2)
if err != nil {
    log.Printf("connect error: %s", err)
    return
}

// do something with conn here

conn.SetDeadline(time.Now())
ログイン後にコピー

上記のコードでは、DialTimeout() メソッドを通じて接続を作成し、タイムアウトを 2 秒に設定します。接続中に例外が発生した場合、Connect メソッドは例外をスローして接続を終了します。それ以外の場合は、接続上で必要な処理を行うことができます。接続が必要ない場合は、SetDeadline() メソッドを使用して接続を閉じることができます。

Go 言語では、ソケットを閉じることは特に複雑ではなく、多くの方法から選択できます。 net.Conn インターフェイスの Close() メソッドまたは Listener インターフェイスの Close() メソッドを使用して、接続またはリスナーを閉じることができます。さらに、タイムアウトを設定して接続を閉じることもできます。以上がこの記事の内容ですので、ご参考になれば幸いです。

以上がgolangでソケットを閉じる方法(2つの方法)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート