このチュートリアルでは、シンプルかつ堅牢な TCP/IP サーバーとクライアントを構築することで、ネットワーク プログラミングをわかりやすく説明します。アプリケーションがネットワーク上でどのように通信するのか疑問に思ったことがあるなら、このガイドが役に立ちます!
コードの説明に入る前に、2 台のコンピューターが通信するときに何が起こっているのかを詳しく見てみましょう。
TCP/IP: 電話のようなものだと考えてください
サーバーとクライアントの役割:
tcp-chat-app/ ├── server/ │ └── server.go # Server-side logic ├── client/ │ └── client.go # Client-side logic └── main.go # Starts both server and client
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) } }
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)) } }
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])) } }
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
行政(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 サイトの他の関連記事を参照してください。