golang之網絡編程


基本介紹:

  網絡編程有兩種:

    1)tcp socket編程,是網絡編程的主流。之所以叫tcp socket編程,是因為底層是基於tcp/ip協議的

    2)b/s結構的http編程,我們使用瀏覽器去訪問服務器時,使用的就是http協議,而http底層依舊是用tcp socket實現的

tcp socket編程的快速入門:

  1.服務端的處理流程

    1)監聽接口:8888

    2)接收客戶端的tcp鏈接,建立客戶端和服務端的鏈接

    3)創建goroutine,處理該鏈接的請求

  2.客戶端的處理流程

    1)建立與服務端的鏈接

    2)發送請求數據,接收服務端返回的結果數據

    3)關閉鏈接

服務端代碼:

package main

import (
    "fmt"
    "net"
)

func process(conn net.Conn) {
    // 這里循環接收客戶端發送的數據
    defer conn.Close()
    for {
        // 創建一個新切片
        buf := make([]byte, 1024)
        fmt.Printf("服務器在等待客戶端%s 發送信息\n", conn.RemoteAddr().String())
        n, err := conn.Read(buf) // 從conn中讀取
        if err != nil {
            fmt.Printf("客戶端退出 err=%v\n", err)
            return
        }
        fmt.Print(string(buf[:n]))
    }
}

func main() {
    fmt.Println("服務器開始監聽...")
    listen, err := net.Listen("tcp", "0.0.0.0:8888")
    if err != nil {
        fmt.Println("listen err=", err)
        return
    }
    defer listen.Close() // 延時關閉
    // 循環等待客戶端來鏈接
    for {
        fmt.Println("等待客戶端來鏈接...")
        conn, err := listen.Accept()
        if err != nil {
            fmt.Println("Accept() err=", err)
        } else {
            fmt.Printf("Accept() suc con=%v 客戶端 ip=%v\n", conn, conn.RemoteAddr().String())
        }
        // 這里准備起一個協程,為客戶端服務
        go process(conn)
    }
}

客戶端代碼:

package main

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

func main() {
    conn, err := net.Dial("tcp", "192.168.2.229:8888")
    if err != nil {
        fmt.Println("client dial err=", err)
        return
    }
    // 功能一:客戶端可以發送單行數據,然后退出
    reader := bufio.NewReader(os.Stdin) // os.Stdin代表標准輸入
    for {
        // 從終端讀取一行用戶輸入,並准備發送給服務器
        line, err := reader.ReadString('\n')
        if err != nil {
            fmt.Println("readString err=", err)
        }
        line = strings.Trim(line, " \r\n")
        if line == "exit" {
            fmt.Println("客戶端退出")
            return
        }
        // 再將line發送給服務器
        _, err = conn.Write([]byte(line + "\n"))
        if err != nil {
            fmt.Println("conn.Write err=", err)
        }
    }
    //fmt.Printf("客戶端發送了 %d 字節的數據,並退出", n)
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM