最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、實(shí)戰(zhàn)背景

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

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

本案例將實(shí)現(xiàn)一個(gè)簡單的 TCP 聊天 服務(wù)器:

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

二、實(shí)戰(zhàn)目標(biāo)

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

TCP服務(wù)器

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

TCP客戶端

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

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

1. TCP服務(wù)器代碼(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)

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

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

    fmt.Println("TCP服務(wù)器已啟動(dòng),監(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("連接服務(wù)器失敗:", err)
        return
    }
    defer conn.Close()

    fmt.Println("已連接到服務(wù)器。請輸入消息,輸入 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"))

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

四、運(yùn)行方式

啟動(dòng)服務(wù)器

go run server.go

輸出示例:

TCP服務(wù)器已啟動(dòng),監(jiān)聽端口 8888...

啟動(dòng)客戶端(多個(gè)終端可同時(shí)運(yùn)行)

go run client.go

輸入消息:

>> hello
服務(wù)器響應(yīng): 服務(wù)端收到: hello

服務(wù)器端輸出:

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

五、關(guān)鍵技術(shù)點(diǎn)解析

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

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

2. listener.Accept()

阻塞方法,等待客戶端連接。每當(dāng)有新連接,就返回一個(gè) net.Conn。

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

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

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

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

5. 客戶端 net.Dial

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

六、可擴(kuò)展方向

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

七、小結(jié)

通過本案例你掌握了:

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

這是構(gòu)建分布式系統(tǒng)、即時(shí)通訊、遠(yuǎn)程控制服務(wù)的基礎(chǔ)能力。

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

相關(guān)文章

  • grpcurl通過命令行訪問gRPC服務(wù)

    grpcurl通過命令行訪問gRPC服務(wù)

    這篇文章主要為大家介紹了grpcurl通過命令行訪問gRPC服務(wù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Golang操作DuckDB實(shí)戰(zhàn)案例分享

    Golang操作DuckDB實(shí)戰(zhàn)案例分享

    DuckDB是一個(gè)嵌入式SQL數(shù)據(jù)庫引擎,它與眾所周知的SQLite非常相似,但它是為olap風(fēng)格的工作負(fù)載設(shè)計(jì)的,DuckDB支持各種數(shù)據(jù)類型和SQL特性,憑借其在以內(nèi)存為中心的環(huán)境中處理高速分析的能力,它迅速受到數(shù)據(jù)科學(xué)家和分析師的歡迎,在這篇博文中,我們將探索在Go中使用DuckDB
    2025-01-01
  • Go語言簡易圖像驗(yàn)證碼生成的實(shí)戰(zhàn)案例

    Go語言簡易圖像驗(yàn)證碼生成的實(shí)戰(zhàn)案例

    本篇我們將使用Go語言結(jié)合第三方庫 github.com/mojocn/base64Captcha,快速實(shí)現(xiàn)一個(gè)簡易圖像驗(yàn)證碼生成接口,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-08-08
  • golang 調(diào)用c語言動(dòng)態(tài)庫方式實(shí)現(xiàn)

    golang 調(diào)用c語言動(dòng)態(tài)庫方式實(shí)現(xiàn)

    本文主要介紹了golang 調(diào)用c語言動(dòng)態(tài)庫方式實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 詳解如何通過Go來操作Redis實(shí)現(xiàn)簡單的讀寫操作

    詳解如何通過Go來操作Redis實(shí)現(xiàn)簡單的讀寫操作

    作為最常用的分布式緩存中間件——Redis,了解運(yùn)作原理和如何使用是十分有必要的,今天來學(xué)習(xí)如何通過Go來操作Redis實(shí)現(xiàn)基本的讀寫操作,需要的朋友可以參考下
    2023-09-09
  • Go整合Redis2.0發(fā)布訂閱的實(shí)現(xiàn)

    Go整合Redis2.0發(fā)布訂閱的實(shí)現(xiàn)

    本文主要介紹了Go整合Redis2.0發(fā)布訂閱,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01
  • 詳解Go語言如何實(shí)現(xiàn)類似Python中的with上下文管理器

    詳解Go語言如何實(shí)現(xiàn)類似Python中的with上下文管理器

    熟悉?Python?的同學(xué)應(yīng)該知道?Python?中的上下文管理器非常好用,那么在?Go?中是否也能實(shí)現(xiàn)上下文管理器呢,下面小編就來和大家仔細(xì)講講吧
    2023-07-07
  • Go map底層實(shí)現(xiàn)與擴(kuò)容規(guī)則和特性分類詳細(xì)講解

    Go map底層實(shí)現(xiàn)與擴(kuò)容規(guī)則和特性分類詳細(xì)講解

    這篇文章主要介紹了Go map底層實(shí)現(xiàn)與擴(kuò)容規(guī)則和特性,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-03-03
  • Go語言操作MySql數(shù)據(jù)庫的詳細(xì)指南

    Go語言操作MySql數(shù)據(jù)庫的詳細(xì)指南

    數(shù)據(jù)的持久化是程序中必不可少的,所以編程語言中對數(shù)據(jù)庫的操作是非常重要的一塊,這篇文章主要給大家介紹了關(guān)于Go語言操作MySql數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • Swaggo零基礎(chǔ)入門教程

    Swaggo零基礎(chǔ)入門教程

    swagger是一套基于OpenAPI規(guī)范構(gòu)建的開源工具,使用RestApi。swagger-ui呈現(xiàn)出來的是一份可交互式的API文檔,可以直接在文檔頁面嘗試API的調(diào)用
    2023-01-01

最新評論

灵宝市| 旬邑县| 花莲市| 甘泉县| 桐城市| 桐柏县| 河曲县| 沙河市| 安国市| 昔阳县| 广灵县| 施甸县| 聂拉木县| 大邑县| 金乡县| 普定县| 阳信县| 鸡西市| 江安县| 遵化市| 广宁县| 成武县| 宜黄县| 乐山市| 固原市| 左云县| 江永县| 罗田县| 北海市| 定边县| 师宗县| 曲阜市| 临漳县| 西宁市| 尼木县| 贺州市| 加查县| 个旧市| 耒阳市| 林甸县| 兴国县|