中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang的網絡編程tcp

發布時間:2020-07-19 11:11:00 來源:網絡 閱讀:381 作者:ck_god 欄目:編程語言
// code_050_socket_knowledge project main.go
package main

import (
    "fmt"
)

//TCP的C/S架構
//TCP客戶端:net.Dial()   Write()  Read()  Close()
//TCP服務器:net.Listen() Accept() Read()  Write() Close()
/*
  Unix基本哲學之一就是“一切皆文件”,
  都可以用“打開open –> 讀寫write/read –> 關閉close”模式來操作。
  Socket就是該模式的一個實現,網絡的Socket數據傳輸是一種特殊的I/O,Socket也是一種文件描述符。
  Socket也具有一個類似于打開文件的函數調用:Socket(),該函數返回一個整型的Socket描述符,
  隨后的連接建立、數據傳輸等操作都是通過該Socket實現的
*/

//常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數據報式Socket(SOCK_DGRAM)。

func main() {
    fmt.Println("Hello World!")
}

服務器

// code_051_tcp_service project main.go
package main

import (
    "fmt"
    "log"
    "net"
    "strings"
)

func dealConn(conn net.Conn) {
    defer conn.Close()

    ipAddr := conn.RemoteAddr().String()
    fmt.Println(ipAddr, "連接成功")

    buf := make([]byte, 1024)
    for {
        //阻塞等待用戶發送的數據
        n, err := conn.Read(buf)
        if err != nil {
            fmt.Println(err)
            return
        }

        //切片截取,只截取有效數據
        result := buf[:n]
        fmt.Printf("接收到數據來自[%s]==>[%d]:%s\n", ipAddr, n, string(result))
        if "exit" == string(result) {
            fmt.Println(ipAddr, "退出連接")
            return
        }
        conn.Write([]byte(strings.ToUpper(string(result))))
    }
}

func main() {
    listenner, err := net.Listen("tcp", "127.0.0.1:8001")
    //go中的接口被占用報錯:An attempt was made to access a socket in a way forbidden by its access permissions.
    if err != nil {
        log.Fatal(err) //log.Fatal()會產生panic
    }

    for {
        conn, err := listenner.Accept()
        if err != nil {
            log.Println(err)
            continue
        }
        go dealConn(conn)
    }

}

客戶端:

// code_052_tcp_client project main.go
package main

import (
    "fmt"
    "log"
    "net"
)

func main() {
    //客戶端主動連接服務器
    conn, err := net.Dial("tcp", "127.0.0.1:8001")
    if err != nil {
        log.Fatal(err) //log.Fatal()會產生panic
        return
    }

    defer conn.Close() //關閉

    buf := make([]byte, 1024) //緩沖區
    for {
        fmt.Printf("請輸入發送的內容:")
        fmt.Scan(&buf) //相當于Python中的input-->>buf = input("請輸入發送的內容")
        fmt.Printf("發送的內容:%s\n", string(buf))

        conn.Write(buf)

        n, err := conn.Read(buf)
        if err != nil {
            fmt.Println(err)
            return
        }
        result := buf[:n]
        fmt.Printf("接收到數據[%d]:%s\n", n, string(result))
    }

}
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巴彦淖尔市| 鸡东县| 西峡县| 同心县| 麦盖提县| 那曲县| 祁阳县| 锡林郭勒盟| 屏南县| 衡水市| 中江县| 阿瓦提县| 安乡县| 安西县| 讷河市| 扶沟县| 平凉市| 雅江县| 黄陵县| 游戏| 印江| 北安市| 汤原县| 晋城| 固安县| 宜兴市| 涿州市| 富川| 桐梓县| 辉县市| 舟山市| 沁源县| 澄迈县| 罗平县| 靖安县| 巴里| 昌黎县| 梅州市| 彰化市| 长海县| 万宁市|