ホームページ >バックエンド開発 >Golang >ネットワーキング : Go での最初の TCP/IP サーバーとクライアント

ネットワーキング : Go での最初の TCP/IP サーバーとクライアント

Barbara Streisand
Barbara Streisandオリジナル
2024-11-30 15:51:13303ブラウズ

Networking : Your First TCP/IP Server and Client in Go

?私たちが学ぶこと

このチュートリアルでは、シンプルかつ堅牢な TCP/IP サーバーとクライアントを構築することで、ネットワーク プログラミングをわかりやすく説明します。アプリケーションがネットワーク上でどのように通信するのか疑問に思ったことがあるなら、このガイドが役に立ちます!

?前提条件

  • 基本的な Go プログラミングの知識
  • ネットワーキングに対する好奇心
  • テキストエディタ
  • コンピュータにインストールしてください
  • Go モジュールが追加されました (go mod init tcpIp を使用)

?ネットワーク通信を理解する

コードの説明に入る前に、2 台のコンピューターが通信するときに何が起こっているのかを詳しく見てみましょう。

  1. TCP/IP: 電話のようなものだと考えてください

    • TCP (伝送制御プロトコル): メッセージが完全かつ順序どおりに配信されることを保証します
    • IP (インターネット プロトコル): メッセージを適切なデバイスにルーティングするのに役立ちます
  2. サーバーとクライアントの役割:

    • サーバー: 受信接続を待機します
    • クライアント: コンタクトを開始し、リクエストを送信します

⁉️ プロジェクトの構造

tcp-chat-app/
├── server/
│   └── server.go   # Server-side logic
├── client/
│   └── client.go   # Client-side logic
└── main.go         # Starts both server and client

?ステップ 1: サーバーの作成

サーバーコードを理解する

package server

import (
    "log"
    "net"
)

// StartServer: Our digital receptionist 
func StartServer() {
    // Choose a "phone number" (address)
    address := "localhost:8080"

    // Set up a "phone line" to listen for calls
    listener, err := net.Listen("tcp", address)
    if err != nil {
        log.Fatalf("Couldn't set up the phone line: %v", err)
    }
    defer listener.Close()

    log.Printf("Server is ready, waiting for connections on %s", address)

    // Forever wait for incoming "calls"
    for {
        // Accept a new connection
        conn, err := listener.Accept()
        if err != nil {
            log.Printf("Missed a call: %v", err)
            continue
        }

        // Handle each "caller" in a separate conversation
        go handleClient(conn)
    }
}

主要な概念の説明

  • net.Listen(): 接続を受信するためのネットワーク「ソケット」を作成します
  • listener.Accept(): 受信接続を待機して受け入れます
  • go handleClient(conn): 各クライアントを別のスレッド (ゴルーチン) で処理します

?クライアント接続の処理

func handleClient(conn net.Conn) {
    // Always clean up after the conversation
    defer conn.Close()

    log.Printf("New client connected: %s", conn.RemoteAddr())

    // Prepare a message buffer
    buffer := make([]byte, 1024)

    // Keep the conversation going
    for {
        // Read message from client
        n, err := conn.Read(buffer)
        if err != nil {
            log.Printf("Connection error: %v", err)
            return
        }

        // Echo the message back
        message := string(buffer[:n])
        log.Printf("Received: %s", message)
        conn.Write([]byte("Server says: " + message))
    }
}

ここで何が起こっているのでしょうか?

  • バッファ: 受信メッセージの一時ストレージ
  • conn.Read(): クライアントからメッセージを受信します
  • conn.Write(): メッセージをクライアントに送り返します

?️ ステップ 2: クライアントの作成

package client

import (
    "bufio"
    "fmt"
    "log"
    "net"
    "os"
)

func StartClient() {
    // Dial the server (like making a phone call)
    conn, err := net.Dial("tcp", "localhost:8080")
    if err != nil {
        log.Printf("Could not connect to server: %v", err)
        return
    }
    defer conn.Close()

    fmt.Println("Connected to server. Start chatting!")

    // Read user input and send to server
    scanner := bufio.NewScanner(os.Stdin)
    for {
        fmt.Print("> ")
        if !scanner.Scan() {
            break
        }

        message := scanner.Text()
        if message == "exit" {
            break
        }

        // Send message to server
        conn.Write([]byte(message + "\n"))

        // Wait for server's response
        response := make([]byte, 1024)
        n, err := conn.Read(response)
        if err != nil {
            log.Printf("Error receiving response: %v", err)
            break
        }

        fmt.Println(string(response[:n]))
    }
}

クライアントの仕組み

  • net.Dial(): サーバーに接続します
  • Scanner.Scan(): ユーザーのキーボード入力を読み取ります
  • conn.Write(): サーバーにメッセージを送信
  • conn.Read(): サーバーの応答を受信します

?すべてをまとめる: main.go

package main

import (
    "time"
    "tcpIp/server"
    "tcpIp/client"
)

func main() {
    // Start server in background
    go func() {
        server.StartServer()
    }()

    // Give server a moment to start
    time.Sleep(time.Second)

    // Launch client
    client.StartClient()
}

?‍♂️ ネットワーク アプリを実行する

go run main.go

?学んだこと

  1. 基本的なネットワーク通信の概念
  2. Go で TCP サーバーを作成する
  3. クライアントをサーバーに接続する
  4. ネットワーク接続を安全に処理する
  5. ネットワークプログラミングにおける基本的なエラー管理

?改善の可能性

  • 認証
  • 複数のクライアントのサポート
  • 堅牢なエラー処理
  • 暗号化

?リソース

  • Go のネット パッケージのドキュメント
  • TCP/IP プロトコルの基本
  • Go での同時プログラミング

参考文献

行政(2023年8月9日)。誰でも使える無料のスイッチングおよびルーティング ガイドで TCP/IP を学びましょう。呪い。 https://cursin.net/en/learn-tcp-ip-with-the-free-switching-and-routing-guide-for-everyone/

ウッドベック、A. (2021)。 Go を使用したネットワーク プログラミング。ノースターチプレス株式会社

ネットワーキングを楽しみましょう! ??

以上がネットワーキング : Go での最初の TCP/IP サーバーとクライアントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。