Go语言实践Gogolang

Go语言学习笔记21.socket编程

2019-11-07  本文已影响0人  快乐的提千万

socket编程分为TCP和UDP的,和C的套接字编程原理一样。
可以参考:https://blog.csdn.net/happy_teemo/article/details/78441982

TCP

服务端:

package main

import (
    "fmt"
    "net"
)

func main() {
    //监听
    listener, err := net.Listen("tcp", "127.0.0.1:8000")
    if err != nil {
        fmt.Println("err = ", err)
        return
    }

    //关闭监听
    defer listener.Close()

    //阻塞等待用户链接
    conn, err := listener.Accept()
    if err != nil {
        fmt.Println("err = ", err)
        return
    }

    //接收用户的请求
    buf := make([]byte, 1024) //1024大小的缓冲区
    n, err1 := conn.Read(buf)
    if err1 != nil {
        fmt.Println("err1 = ", err1)
        return
    }

    fmt.Println("buf = ", string(buf[:n]))

    defer conn.Close() //关闭当前用户链接
}

客户端:

package main

import (
    "fmt"
    "net"
)

func main() {
    //主动连接服务器
    conn, err := net.Dial("tcp", "127.0.0.1:8000")
    if err != nil {
        fmt.Println("err = ", err)
        return
    }

    //延时关闭
    defer conn.Close()

    //发送数据
    conn.Write([]byte("你好"))

}

UDP

服务端不用和客户端握手连接了

package main

import (
    "fmt"
    "net"
    "os"
)

func main() {

    addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8000")
    if err != nil {
        fmt.Println("Can't resolve address: ", err)
        os.Exit(1)
    }

    //监听
    listener, err := net.ListenUDP("udp", addr)
    if err != nil {
        fmt.Println("err = ", err)
        return
    }

    //关闭监听
    defer listener.Close()

    //接收用户的请求
    for {
        data := make([]byte, 1024)
        n, remoteAddr, err := listener.ReadFromUDP(data)
        if err != nil {
            fmt.Println("failed to read UDP msg because of ", err.Error())
            return
        }
        fmt.Println(n, remoteAddr)//长度和IP
        fmt.Println("buf = ", string(data[:n])) //打印内容
    }
}

客户端:

package main

import (
    "fmt"
    "net"
    "os"
)

func main() {
    //主动连接服务器
    addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8000")
    if err != nil {
        fmt.Println("Can't resolve address: ", err)
        os.Exit(1)
    }
    conn, err := net.DialUDP("udp", nil, addr)
    if err != nil {
        fmt.Println("Can't dial: ", err)
        os.Exit(1)
    }

    //延时关闭
    defer conn.Close()

    //发送数据
    conn.Write([]byte("你好"))

}
上一篇 下一篇

猜你喜欢

热点阅读