TCP 基礎詳解:Telnet 迴音服務器搭建

概述

Telnet 迴音服務器是一個簡單而實用的網絡應用,通過 Telnet 協議連接,用戶輸入什麼,服務器就回顯什麼。

本文將介紹如何使用 Go 語言創建一個 Telnet 迴音服務器,通過完整的示例代碼和詳細註釋,便於理解 TCP 服務器的基本結構和實現。

1. TCP 服務器基礎

TCP 協議簡介

package main
import (
"fmt"
"net"
)
func main() {
  listener, err := net.Listen("tcp", ":8080")
  if err != nil {
    panic(err)
  }
  defer listener.Close()
  fmt.Println("Telnet迴音服務器已啓動,監聽端口8080...")
  for {
    conn, err := listener.Accept()
    if err != nil {
      fmt.Println("連接失敗:", err)
      continue
    }
    go handleConnection(conn)
  }
}
func handleConnection(conn net.Conn) {
  defer conn.Close()
  buffer := make([]byte, 1024)
  for {
    n, err := conn.Read(buffer)
    if err != nil {
      fmt.Println("讀取數據失敗:", err)
      return
    }
    data := buffer[:n]
    fmt.Println("收到消息:", string(data))
    _, err = conn.Write(data)
    if err != nil {
      fmt.Println("發送消息失敗:", err)
      return
    }
  }
}

2. Telnet 迴音服務器實現

處理 Telnet 協議

package main
import (
"bufio"
"fmt"
"net"
)
func main() {
  listener, err := net.Listen("tcp", ":8080")
  if err != nil {
    panic(err)
  }
  defer listener.Close()
  fmt.Println("Telnet迴音服務器已啓動,監聽端口8080...")
  for {
    conn, err := listener.Accept()
    if err != nil {
      fmt.Println("連接失敗:", err)
      continue
    }
    go handleTelnetConnection(conn)
  }
}
func handleTelnetConnection(conn net.Conn) {
  defer conn.Close()
  fmt.Fprint(conn, "歡迎來到Telnet迴音服務器!\n")
  scanner := bufio.NewScanner(conn)
  for scanner.Scan() {
    input := scanner.Text()
    fmt.Println("收到消息:", input)
    fmt.Fprintln(conn, "迴音:"+input)
  }
  if err := scanner.Err(); err != nil {
    fmt.Println("讀取數據失敗:", err)
  }
}

3. 安全關閉服務器

優雅關閉服務器

package main
import (
  "bufio"
  "fmt"
  "net"
  "os"
  "os/signal"
  "syscall"
)
func main() {
  listener, err := net.Listen("tcp", ":8080")
  if err != nil {
    panic(err)
  }
  defer listener.Close()
  fmt.Println("Telnet 迴音服務器已啓動,監聽端口8080...")
  // 監聽系統信號,實現優雅關閉服務器
  signalChannel := make(chan os.Signal, 1)
  signal.Notify(signalChannel, syscall.SIGINT, syscall.SIGTERM)
  go func() {
    <-signalChannel
    fmt.Println("\n 接收到關閉信號,正在優雅關閉服務器...")
    listener.Close()
    os.Exit(0)
  }()
  for {
    conn, err := listener.Accept()
    if err != nil {
      fmt.Println("連接失敗:", err)
      continue
    }
    go handleTelnetConnection(conn)
  }
}

4. Telnet 迴音服務器實踐

使用 Telnet 客戶端連接

啓動 Telnet 客戶端並連接到服務器

telnet 127.0.0.1 8080

輸入消息,觀察服務器迴音

歡迎來到Telnet迴音服務器!
Hello, Go!
迴音:Hello, Go!

總結

通過本文的介紹,讀者已經瞭解瞭如何使用 Go 語言構建一個簡單的 Telnet 迴音服務器。

從 TCP 服務器的基本結構到連接處理的 goroutine,每一步都被清晰地呈現出來。

希望本文能夠幫助讀者理解 TCP 服務器的運作原理,並在實際項目中更加靈活運用。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/wahPh8NTQWIciRxpsTCLrQ