从Socket Golang读取数据

我正在尝试从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来积累数据。

以上是 从Socket Golang读取数据 的全部内容, 来源链接: utcz.com/qa/422236.html

回到顶部