以太坊源码学习(一)
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

浙公网安备 33010602011771号