以太坊源码学习(一)

goland自动补全函数返回值快捷键: ctrl+alt+v

1、使用UDP协议实现通信的简单实例

UDPServer.go

package main

import (
    "net"
    "fmt"
)

func main(){
    //创建监听写法1 (此处写成 udp 和 udp4 均可)
    socket, err := net.ListenUDP("udp4", &net.UDPAddr{
        IP: net.IPv4(0, 0, 0, 0),
        Port: 8080,
    })
    //创建监听写法2 (此处写成 udp 和 udp4 均可)
    udpaddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8080")
    socket, err := net.ListenUDP("udp", udpaddr)

    if err != nil{
        fmt.Println("监听失败!", err)
        return
    }else {
        fmt.Println("监听成功!")
    }
    defer socket.Close()
    for{
        //读取数据
        data := make([]byte, 4096)
        read, remoteAddr, err := socket.ReadFromUDP(data)
        if err != nil{
            fmt.Println("读取数据失败!", err)
            continue
        }
        fmt.Println(read, remoteAddr)
        fmt.Printf("%s\n\n", data)
        //发送数据
        senddata := []byte("hello client!")
        _, err = socket.WriteToUDP(senddata, remoteAddr)
        if err != nil{
            fmt.Println("发送数据失败!", err)
            return
        }
    }
}

UDPClient.go

package main

import (
    "net"
    "fmt"
)

func main() {
    //创建连接写法1 (此处写成 udp 和 udp4 均可)
    socket, err := net.DialUDP("udp4", nil, &net.UDPAddr{
        IP: net.IPv4(127, 0, 0, 1),
        Port: 8080,
    })
    //创建连接写法2 (此处写成 udp 和 udp4 均可)
    udpaddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8080")
    socket, err := net.DialUDP("udp4", nil, udpaddr)
    
    if err != nil{
        fmt.Println("连接失败!", err)
        return
    }else {
        fmt.Println("连接成功!")
    }
    defer socket.Close()
    //发送数据
    senddata := []byte("hello server")
    _, err = socket.Write(senddata)
    if err != nil{
        fmt.Println("发送数据失败!", err)
        return
    }
    //接收数据
    data := make([]byte, 4096)
    read, remoteAddr, err := socket.ReadFromUDP(data)
    if err != nil{
        fmt.Println("读取数据失败!", err)
        return
    }
    fmt.Println(read, remoteAddr)
    fmt.Printf("%s\n", data)
}

 2、使用TCP协议实现通信的简单实例

TCPServer.go

package main

import (
    "net"
    "fmt"
    "time"
)

//接收外部的请求
func main() {
    //启动TCP监听器
    listener, err := net.Listen("tcp", "127.0.0.1:8555")
    if err != nil{
        return
    }
    tokens := 10
    slots := make(chan struct{}, tokens)
    for i := 0; i<tokens; i++{
        slots <- struct{}{}
    }

    for{
        <-slots
        fd, err := listener.Accept()
        if err != nil{
            return
        }
        fmt.Println("========", fd)
    }
    for{
        time.Sleep(1000)
    }
}

TCPClient.go

package main

import (
    "net"
    "fmt"
    "time"
)

func main(){
    defaultDialTimeout      := 15 * time.Second
    dialer := &net.Dialer{Timeout: defaultDialTimeout}
    fd, err := dialer.Dial("tcp", "127.0.0.1:8555")
    if err != nil {
        return
    }
    fmt.Println("---------", fd)
}

 

 

nat穿透实现参考链接     https://blog.csdn.net/qq_31967569/article/details/82704340

posted @ 2019-01-29 11:12  将王相  阅读(523)  评论(0)    收藏  举报