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  }