Sockets 从Socket Golang读取数据
我正在尝试从golang的telnet会话读取数据。为了实现这一点,我编写了以下函数 最初我遇到了一个问题,我从一个没有数据的套接字读取数据,所以它会锁定并且永远不会返回。BufferSocketData是我解决这个问题的尝试,因为我不知道是否有数据要读取。其思想是,它将等待1秒,然后确定套接字中没有数据,并返回一个空字符串 GetData似乎在缓冲区中第一次有新数据时就可以工作,但除此之外,它不会获得新数据。我确信这与我对goroutines和Channel的使用有关,我是新手,我确信我没有正确使用它们 关于为什么我的后续读取没有返回数据,有什么想法吗Sockets 从Socket Golang读取数据,sockets,go,Sockets,Go,我正在尝试从golang的telnet会话读取数据。为了实现这一点,我编写了以下函数 最初我遇到了一个问题,我从一个没有数据的套接字读取数据,所以它会锁定并且永远不会返回。BufferSocketData是我解决这个问题的尝试,因为我不知道是否有数据要读取。其思想是,它将等待1秒,然后确定套接字中没有数据,并返回一个空字符串 GetData似乎在缓冲区中第一次有新数据时就可以工作,但除此之外,它不会获得新数据。我确信这与我对goroutines和Channel的使用有关,我是新手,我确信我没有正
/*
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
}
}
/*
ReadDataFromSocket-尝试读取套接字中的任何数据。
*/
func ReadDataFromSocket(sock io.Reader,c chan字符串){
var recvData=make([]字节,1024)
变量numBytes,u=sock.Read(recvData)
c用于读取有时间限制的数据:
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
}
}
请注意,单次调用读取可能不会读取对等方发送的所有数据。您可能希望通过在循环或调用中调用读取来累积数据。用于读取有时间限制的数据:
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
}
}
请注意,单次调用读取可能不会读取对等方发送的所有数据。您可能希望通过在循环或调用中调用读取来累积数据。这非常有效。我有另一个函数,它会尝试读取,直到正则表达式匹配或超时,因此GetData执行单次读取正是我所需要的。谢谢!您不会遇到k现在,如何对SSH会话对象执行类似的操作?SSH会话对象需要一种不同的方法。就此提出一个新问题。编写一个新问题这非常有效。我有另一个函数,它会尝试读取,直到正则表达式匹配或出现超时,因此GetData执行单个读取正是我所需要的eed。谢谢!你不会碰巧知道如何对SSH会话对象执行类似的操作吧?SSH会话对象需要不同的方法。提出一个新问题。写一个新问题