github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/p2p/simulations/adapters/ws.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 package adapters 10 11 import ( 12 "bufio" 13 "errors" 14 "io" 15 "regexp" 16 "strings" 17 "time" 18 ) 19 20 //wsaddrpattern是一个regex,用于从节点的 21 //日志 22 var wsAddrPattern = regexp.MustCompile(`ws://[\D::] +) 23 24 func matchWSAddr(str string) (string, bool) { 25 if !strings.Contains(str, "WebSocket endpoint opened") { 26 return "", false 27 } 28 29 return wsAddrPattern.FindString(str), true 30 } 31 32 //findwsaddr通过读卡器r扫描,查找 33 //WebSocket地址信息。 34 func findWSAddr(r io.Reader, timeout time.Duration) (string, error) { 35 ch := make(chan string) 36 37 go func() { 38 s := bufio.NewScanner(r) 39 for s.Scan() { 40 addr, ok := matchWSAddr(s.Text()) 41 if ok { 42 ch <- addr 43 } 44 } 45 close(ch) 46 }() 47 48 var wsAddr string 49 select { 50 case wsAddr = <-ch: 51 if wsAddr == "" { 52 return "", errors.New("empty result") 53 } 54 case <-time.After(timeout): 55 return "", errors.New("timed out") 56 } 57 58 return wsAddr, nil 59 }