sockets - 从 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 可能不会读取对等方发送的所有数据。您可能希望通过在循环中调用 Read 或调用io.ReadFull来累积数据。
推荐阅读
- javascript - 如何运行不同包的 npm 命令
- android - 编辑文本的有限 WRAP_CONTENT
- bash - 使用脚本的输出完成 Bash
- javascript - 处理提交数据未显示来自子表单组件的数据
- javascript - 在这个例子中,如何使用 vue.js 在 for 循环中设置标题?
- python - 如何读取存储在文本文件中的数字,然后将它们作为整数存储在列表或数组中
- python - 我得到 SyntaxError: invalid syntax while using %precision 2
- android - 从 RecyclerView 中删除一行
- powershell - 需要使用 PowerShell 连接到 DB2 数据库
- ios - 我无法让类别出现在表格视图单元格中