TCPサーバーをゼロから作成します
net.listenを使用して、指定されたポートにTCPリスナーを作成します。 2。リスナーを介して接続を受け入れ、ゴルチンと同時に処理します。 3.ハンドルコネクションとエコーのクライアントデータを読み取ります。 4.コンテキストと信号を使用してエレガントな閉鎖を実現し、接続が完了するのを待ちます。 5. TelnetまたはNCを介してサーバーをテストします。 Goのネットパッケージは、Goroutineと組み合わせて完全なTCPプログラミング機能を提供し、高い並行性を簡単に実現し、Deferを介した接続シャットダウン、およびコンテキストとWaitgroupを使用したエレガントなシャットダウンを確保します。このサーバーはシンプルですが、拡張可能で、カスタムプロトコルをサポートするか、TLSを追加し、完全で理解しやすい基本的なTCPサーバーの実装です。
GOの優れた標準ライブラリと軽量の並行性モデルのおかげで、GOでTCPサーバーを作成することはあまり必要ありません。通常、既存のパッケージを活用せずに「ゼロから」生産サーバーを作成することはありませんが、基本的なパッケージを構築することで、ネットワークプログラミングの仕組みを理解するのに役立ちます。標準のnet
パッケージのみを使用して、シンプルなTCPサーバーを段階的に作成する方法は次のとおりです。

1.基本的なTCPリスナーのセットアップ
TCPサーバーの基礎は、特定のポートでの着信接続を待つリスナーです。 Goでは、これはnet.Listen
関数を使用して行われます。
パッケージメイン 輸入 ( "ログ" "ネット" )) func main(){ // TCPポート8080で聞いてください リスナー、err:= net.listen( "tcp"、 ":8080") err!= nil { log.fatal( "ポート8080にバインドできなかった:"、err) } reaster.close()defer log.println( "サーバーリスニング:8080") のために { //着信接続を受け入れます conn、err:= listener.accept() err!= nil { log.println( "接続を受け入れなかった:"、err) 続行します } //新しいGoroutineで各接続を処理します Handleconnection(conn)に行く } }
これにより、ポート8080に耳を傾けるサーバーが設定され、ループを入力して着信接続を受け入れます。次に、各接続が別のゴルウチンでハンドラー関数に渡されます。これは輝く場所で、同時処理がシンプルで効率的になります。

2。クライアント接続の処理
クライアントが接続したら、データを読み取り、標準のI/O操作を使用してデータにデータを書き込むことができます。
func handleconnection(conn net.conn){ defer conn.close() バッファ:= make([] byte、1024) のために { //クライアントからデータを読み取ります n、err:= conn.read(buffer) err!= nil { log.println( "Connection closht by Client:"、err) 戻る } //受信したデータをエコーバックします メッセージ:=バッファー[:n] log.printf( "受信:%s"、メッセージ) _、err = conn.write([] byte( "echo:" string(message)))) err!= nil { log.println( "応答の送信に失敗しました:"、err) 戻る } } }
このハンドラーは、一度に最大1024バイトまで読み取り、メッセージをログに記録し、「エコー」応答をクライアントに送り返します。クライアントが接続を閉じるか、エラーが発生するまでループは続きます。

?注:これは基本的なエコーサーバーです。実際のプロトコル(HTTP、Redis、またはカスタムバイナリ形式など)には、特定の形式に従って着信バイトを解析することが含まれます。
3.優雅なシャットダウンの追加(オプションですが推奨)
生産のような動作については、信号(CTRL Cなど)を受信するときにサーバーを優雅に停止することをお勧めします。
パッケージメイン 輸入 ( "コンテクスト" "ログ" "ネット" 「OS」 「OS/信号」 「同期」 「syscall」 )) func main(){ リスナー、err:= net.listen( "tcp"、 ":8080") err!= nil { log.fatal( "ポート8080にバインドできなかった:"、err) } reaster.close()defer log.println( "サーバーリスニング:8080") //アクティブな接続を追跡するためにグループを待ちます var wg sync.waitgroup //チャネルへのチャネルシャットダウン ctx、stop:= context.withcancel(context.background()) defer stop() // Goroutineは割り込み信号を聞く go func(){ sigch:= make(chan os.signal、1) signal.notify(sigch、syscall.sigint、syscall.sigterm) <-sigch log.println( "\ nshutting down server ...") 停止() listener.close()//これはcompept()をブロックします }() //ループを受け入れます のために { conn、err:= listener.accept() select { ケース<-ctx.done(): 壊す デフォルト: } err!= nil { //コンテキストがキャンセルされたかどうかを確認します select { ケース<-ctx.done(): log.println( "サーバーは新しい接続の受け入れを停止しました。") 壊す デフォルト: log.println( "接続を受け入れなかった:"、err) 続行します } } wg.add(1) go func(c net.conn){ wg.done()を延期する ハンドルコネクション(c) }(conn) } //すべての接続が終了するのを待ちます wg.wait() log.println( "すべての接続が閉じた。サーバーが停止した。") }
これで、サーバーはCtrl C
で優雅に停止することができ、出る前にアクティブな接続が終了するのを待ちます。
4.サーバーのテスト
telnet
またはnc
(NetCat)を使用してサーバーをテストできます。
Telnet localhost 8080
次に、メッセージを入力します。
127.0.0.1を試してみてください... LocalHostに接続。 脱出キャラクターは「^] 'です。 こんにちは エコー:こんにちは
またはnc
を使用します:
エコー「こんにちは」| NC LocalHost 8080 #出力:ECHO:こんにちは
覚えておくべき重要なポイント
- Goの
net
パッケージは、低レベルのTCPプログラミングに必要なすべてを提供します。 - 各接続は、並行性をサポートするために別のゴロウチンで処理する必要があります。
- リソースの漏れを避けるために、常に接続(
defer conn.Close()
)を閉じてください。 -
context
とsync.WaitGroup
を使用して、優雅なシャットダウンを行います。 - バッファサイズ(1024バイトなど)は任意のものです。実際のアプリケーションは動的読み取り値(
bufio.Scanner
または長さが埋められたメッセージを使用する)が必要になる場合があります。
基本的に、それはGOの完全に機能的なTCPサーバーです。最小限で、教育的で、拡張可能です。カスタムプロトコルを構築したり、TLSを追加したり、上にメッセージフレーミングを実装できます。複雑ではなく、強力です。
以上がTCPサーバーをゼロから作成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

GOプログラミングのリソース管理:MySQLとRedisは、特にデータベースとキャッシュを使用して、リソースを正しく管理する方法を学習するために接続およびリリースします...

PostgreSQLデータベースリソース監視スキームの詳細な説明CENTOSシステムこの記事では、CENTOSシステム上のPostgreSQLデータベースリソースを監視するさまざまな方法を紹介し、潜在的なパフォーマンスの問題をタイムリーに発見および解決するのに役立ちます。 1. POSTGRESQLビルトインツールとビューを使用するPostgreSQLには、パフォーマンスとステータスの監視に直接使用できます。 PG_STAT_STATEMENTS:SQLステートメント統計を収集し、クエリパフォーマンスボトルネックを分析します。 PG_STAT_DATABASE:トランザクションカウント、キャッシュヒットなどのデータベースレベルの統計を提供します

goisastrongchoiceforprojectsingingingimplicity、andconcurrency、butmaylackinadvencedecosystemmaturity.1)

fortheInit functioningoareの場合:1)configurationfilesbemainprogramstarts、2)初期化Globalvariables、および3)running-checksSorvalidationseforetheprogramprocutess.theinitistomationaledemainforeThemainfunction、Makin

同じパッケージ内の異なるファイルで小文字名を使用する方法は?ゴーに...
