欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Go創(chuàng)建一個TCP服務器的操作步驟

 更新時間:2025年08月04日 08:22:23   作者:程序員愛釣魚  
在網(wǎng)絡編程中,TCP?是最常見的傳輸協(xié)議之一,Go?提供了?net?包,可以方便地實現(xiàn)?TCP?服務器與客戶端通信,本篇將以實戰(zhàn)形式演示如何用?Go?創(chuàng)建一個?TCP?服務器,并讓多個客戶端與之通信,需要的朋友可以參考下

一、實戰(zhàn)背景

相比 HTTP 請求響應,TCP 通信更底層、更靈活,適合用在:

  • 游戲服務器
  • 實時聊天程序
  • 長連接服務
  • 數(shù)據(jù)同步服務

本案例將實現(xiàn)一個簡單的 TCP 聊天 服務器:

  • 支持多個客戶端連接
  • 客戶端發(fā)送內(nèi)容,服務器打印并回應
  • 演示并發(fā)連接處理

二、實戰(zhàn)目標

構建一個簡單的 TCP 網(wǎng)絡程序,包含兩個組件:

TCP服務器

  • 啟動監(jiān)聽指定端口
  • 接收多個客戶端連接
  • 每條連接獨立處理,讀取數(shù)據(jù)并回復

TCP客戶端

  • 連接到服務器
  • 從終端輸入消息并發(fā)送
  • 接收服務器返回的響應

三、完整代碼實現(xiàn)

1. TCP服務器代碼(server.go)

package main

import (
    "bufio"
    "fmt"
    "net"
    "strings"
)

func handleConnection(conn net.Conn) {
    defer conn.Close()
    addr := conn.RemoteAddr().String()
    fmt.Println("客戶端連接:", addr)

    reader := bufio.NewReader(conn)
    for {
        data, err := reader.ReadString('\n')
        if err != nil {
            fmt.Println("客戶端斷開:", addr)
            return
        }
        msg := strings.TrimSpace(data)
        fmt.Printf("收到[%s]: %s\n", addr, msg)

        // 回復消息
        response := fmt.Sprintf("服務端收到: %s\n", msg)
        conn.Write([]byte(response))
    }
}

func main() {
    listener, err := net.Listen("tcp", ":8888")
    if err != nil {
        fmt.Println("啟動失敗:", err)
        return
    }
    defer listener.Close()

    fmt.Println("TCP服務器已啟動,監(jiān)聽端口 8888...")
    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("連接失敗:", err)
            continue
        }
        go handleConnection(conn)
    }
}

2. TCP客戶端代碼(client.go)

package main

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

func main() {
    conn, err := net.Dial("tcp", "127.0.0.1:8888")
    if err != nil {
        fmt.Println("連接服務器失敗:", err)
        return
    }
    defer conn.Close()

    fmt.Println("已連接到服務器。請輸入消息,輸入 exit 退出:")

    reader := bufio.NewReader(os.Stdin)
    for {
        fmt.Print(">> ")
        input, _ := reader.ReadString('\n')
        input = strings.TrimSpace(input)
        if input == "exit" {
            fmt.Println("斷開連接")
            return
        }

        // 發(fā)送消息
        conn.Write([]byte(input + "\n"))

        // 接收服務器響應
        response, _ := bufio.NewReader(conn).ReadString('\n')
        fmt.Println("服務器響應:", strings.TrimSpace(response))
    }
}

四、運行方式

啟動服務器

go run server.go

輸出示例:

TCP服務器已啟動,監(jiān)聽端口 8888...

啟動客戶端(多個終端可同時運行)

go run client.go

輸入消息:

>> hello
服務器響應: 服務端收到: hello

服務器端輸出:

客戶端連接: 127.0.0.1:53458
收到[127.0.0.1:53458]: hello

五、關鍵技術點解析

1. net.Listen("tcp", ":8888")

用于監(jiān)聽本地 8888 端口,協(xié)議為 TCP。支持 IPv4、IPv6。

2. listener.Accept()

阻塞方法,等待客戶端連接。每當有新連接,就返回一個 net.Conn。

3. 并發(fā)處理連接

使用 go handleConnection(conn),每個客戶端獨立處理,避免阻塞。

4. bufio.NewReader(conn).ReadString('\n')

按行讀取客戶端發(fā)送內(nèi)容。注意客戶端必須發(fā)送換行(\n)結束,否則會阻塞。

5. 客戶端 net.Dial

客戶端使用 net.Dial("tcp", addr) 建立連接。注意服務端地址和端口應正確。

六、可擴展方向

方向實現(xiàn)建議
廣播機制使用 map[conn]bool 存儲連接,廣播消息
客戶端昵稱每個連接輸入昵稱,并用于標識消息來源
心跳檢測定期向客戶端發(fā)送 ping,判斷是否掉線
JSON 協(xié)議使用結構化數(shù)據(jù)通訊
TLS 加密通信使用 crypto/tls 加密 TCP 通道
多線程聊天室支持多房間并發(fā)聊天

七、小結

通過本案例你掌握了:

  • 如何編寫基本的 TCP 服務端和客戶端
  • 使用 Goroutine 實現(xiàn)并發(fā)連接處理
  • 使用 bufio.Reader/Writer 實現(xiàn)按行讀寫
  • 終端交互式發(fā)送/接收消息

這是構建分布式系統(tǒng)、即時通訊、遠程控制服務的基礎能力。

到此這篇關于使用Go創(chuàng)建一個TCP服務器的操作步驟的文章就介紹到這了,更多相關Go創(chuàng)建TCP服務器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Golang中interface轉(zhuǎn)string輸出打印方法

    Golang中interface轉(zhuǎn)string輸出打印方法

    這篇文章主要給大家介紹了關于Golang中interface轉(zhuǎn)string輸出打印的相關資料,在go語言中interface轉(zhuǎn)string可以直接使用fmt提供的fmt函數(shù),文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • Go?http請求排隊處理實戰(zhàn)示例

    Go?http請求排隊處理實戰(zhàn)示例

    這篇文章主要為大家介紹了Go?http請求排隊處理實戰(zhàn)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Go語言通過反射實現(xiàn)獲取各種類型變量的值

    Go語言通過反射實現(xiàn)獲取各種類型變量的值

    反射是程序在運行期間獲取變量的類型和值、或者執(zhí)行變量的方法的能力,這篇文章主要為大家講講Go語言通過反射獲取各種類型變量值的方法,需要的可以參考下
    2023-07-07
  • Golang共享變量如何解決問題

    Golang共享變量如何解決問題

    協(xié)程之間的通信只能夠通過通道。但是我們習慣于共享變量,而且很多時候使用共享變量能讓代碼更簡潔。那么Golang共享變量如何解決問題,感興趣的可以了解一下
    2021-12-12
  • Golang時間及時間戳的獲取轉(zhuǎn)換超全面詳細講解

    Golang時間及時間戳的獲取轉(zhuǎn)換超全面詳細講解

    說實話,golang的時間轉(zhuǎn)化還是很麻煩的,最起碼比php麻煩很多,下面這篇文章主要給大家介紹了關于golang時間/時間戳的獲取與轉(zhuǎn)換的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • Go語言range關鍵字循環(huán)時的坑

    Go語言range關鍵字循環(huán)時的坑

    今天小編就為大家分享一篇關于Go語言range關鍵字循環(huán)時的坑,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Go gorilla securecookie庫的安裝使用詳解

    Go gorilla securecookie庫的安裝使用詳解

    這篇文章主要介紹了Go gorilla securecookie庫的安裝使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Go語言學習之指針的用法詳解

    Go語言學習之指針的用法詳解

    這篇文章主要為大家詳細介紹了Go語言中指針的用法,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的可以參考一下
    2022-04-04
  • golang解析html網(wǎng)頁的方法

    golang解析html網(wǎng)頁的方法

    今天小編就為大家分享一篇golang解析html網(wǎng)頁的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 一文詳解Golang的函數(shù)特性

    一文詳解Golang的函數(shù)特性

    函數(shù)是?Golang?中非常重要的組成部分之一,它們提供了代碼的可重用性和組織性。在本文中,我們將深入了解?Golang?函數(shù)的多個方面,希望對大家有所幫助
    2023-04-04

最新評論