github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/p2p/simulations/adapters/ws.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 12:09:44</date> 10 //</624342660945022976> 11 12 package adapters 13 14 import ( 15 "bufio" 16 "errors" 17 "io" 18 "regexp" 19 "strings" 20 "time" 21 ) 22 23 //wsaddrpattern是一个regex,用于从节点的 24 //日志 25 var wsAddrPattern = regexp.MustCompile(`ws://[\D::] +) 26 27 func matchWSAddr(str string) (string, bool) { 28 if !strings.Contains(str, "WebSocket endpoint opened") { 29 return "", false 30 } 31 32 return wsAddrPattern.FindString(str), true 33 } 34 35 //findwsaddr通过读卡器r扫描,查找 36 //WebSocket地址信息。 37 func findWSAddr(r io.Reader, timeout time.Duration) (string, error) { 38 ch := make(chan string) 39 40 go func() { 41 s := bufio.NewScanner(r) 42 for s.Scan() { 43 addr, ok := matchWSAddr(s.Text()) 44 if ok { 45 ch <- addr 46 } 47 } 48 close(ch) 49 }() 50 51 var wsAddr string 52 select { 53 case wsAddr = <-ch: 54 if wsAddr == "" { 55 return "", errors.New("empty result") 56 } 57 case <-time.After(timeout): 58 return "", errors.New("timed out") 59 } 60 61 return wsAddr, nil 62 } 63