【发布时间】:2016-11-29 21:00:30
【问题描述】:
我确实有一个从第二个本地进程接收数据的进程。我需要测试连接错误是否得到妥善处理,以及它是否会在断开连接后自动重新连接并继续接收数据。
为此,我试图使其突然断开连接或将 TCP 连接置于单元测试的错误状态。 如this question 中所见,为了检查连接是否已关闭,我正在检查要来的数据并测试它是否返回错误。 我不知道如何:
- 不礼貌地关闭连接
- 使其处于错误状态
这是我的数据接收器的本质:
import (
"bufio"
"encoding/json"
"fmt"
"io"
"net"
)
type Message struct {
ID string `json:"id"`
}
func ReceiveData(listener Listener) {
var tcpConn net.Conn
var addr string = "127.0.0.1:9999"
tcpConn, err := net.Dial("tcp", addr)
socketReader := bufio.NewReader(tcpConn)
decoder := json.NewDecoder(socketReader)
for {
var msg Message
if err := decoder.Decode(&msg); err == io.EOF {
listener.ProcessUpdate(Message{}, fmt.Errorf("Received EOF"), nil)
tcpConn = nil
return
} else if err != nil {
listener.ProcessUpdate(Message{}, nil, fmt.Errorf("Error decoding message: %s", err.Error()))
tcpConn = nil
return
}
// process message
_ = msg
// Test disconnection
// This does not disconnect:
// tcpConn = nil
// This does but gracefully:
// tcpConn.Close()
}
我不是在模拟 TCP 连接,因为我想尝试使用真正的数据生产者。有需要我会看的。
【问题讨论】:
-
“不优雅地”关闭连接到底是什么意思?
-
意外断开,有人拔掉电缆,另一端掉电,tcp 消息格式错误。我怀疑其中大部分会产生超时,我不知道
tcpConn.Read()可能产生的所有错误。 -
如果您希望远程端模拟断开连接,例如拔掉电缆或断电,请确保禁用 keepalive 并停止响应。如果您想以各种其他方式断开连接,则需要在网络上的较低级别执行此操作。