我正在尝试从golang中的telnet会话读取数据。为了达到这个目的,我编写了以下函数。
最初,我遇到一个问题,即我从没有数据的套接字读取数据,因此它将锁定并且永远不会返回。BufferSocketData是我尝试解决此问题的方法,因为我不知道是否有要读取的数据。这个想法是它将等待1秒钟,然后确定套接字中没有数据并返回一个空字符串。
GetData似乎第一次在缓冲区中有新数据时起作用,但除此之外,它没有任何新数据。我确定这与我使用goroutine和通道有关,我是新手,我确定我没有正确使用它们。
关于为什么我的后续读取不返回任何数据的任何想法?
/* ReadDataFromSocket - Attempts to read any data in the socket. */ func ReadDataFromSocket(sock io.Reader, c chan string) { var recvData = make([]byte, 1024) var numBytes, _ = sock.Read(recvData) c <- string(recvData[:numBytes]) } /* BufferSocketData - Read information from the socket and store it in the buffer. */ func (tn *TelnetLib) BufferSocketData(inp chan string, out chan string) { var data string var timeout int64 = 1000 // 1 second timeout. var start = utils.GetTimestamp() for utils.GetTimestamp()-start < timeout { select { case data = <-inp: default: } if data != "" { break } } out <- data } /* GetData - Start goroutines to get and buffer data. */ func (tn *TelnetLib) GetData() { var sockCh = make(chan string) var buffCh = make(chan string) go ReadDataFromSocket(tn.Conn, sockCh) go tn.BufferSocketData(sockCh, buffCh) var data = <-buffCh if data != "" { tn.Buffer += data } }
如果您需要任何其他信息,请告诉我。
使用SetReadDeadline读取具有时间限制的数据:
func (tn *TelnetLib) GetData() { tn.Conn.SetReadDeadline(time.Second) recvData := make([]byte, 1024) n, err := tn.Conn.Read(recvData) if n > 0 { // do something with recvData[:n] } if e, ok := err.(interface{ Timeout() bool }); ok && e.Timeout() { // handle timeout } else if err != nil { // handle error } }
请注意,单个呼叫读取可能无法读取对等方发送的所有数据。您可能需要通过循环调用Read或io.ReadFull来积累数据。