- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在用 Golang 编写一个 TCP 客户端。服务器永远不会发送任何回复或任何数据。
一旦我在给定的超时后无法写入,我希望客户端关闭连接。
因此,通过阅读 Conn
中的 SetWriteDeadline
文档: https://golang.org/pkg/net/#Conn
// SetWriteDeadline sets the deadline for future Write calls
// and any currently-blocked Write call.
// Even if write times out, it may return n > 0, indicating that
// some of the data was successfully written.
// A zero value for t means Write will not time out.
SetWriteDeadline(t time.Time) error
根据上面的描述我是这样使用的:
...
for {
select {
case msg := <-messages:
conn.SetWriteDeadline(time.Now().Add(1 * time.Second))
// When server goes away this just blocks forever. No timeout!
n, err := conn.Write(msg.ByteArray())
if err != nil {
return err
}
log.Printf("Sent %v bytes\n", n)
}
}
...
但如果服务器消失,则永远不会触发超时,Write
调用将永远阻塞。
SetWriteDeadline
我做错了什么?SetWriteDeadline
不是正确的方法,我该怎么做?最佳答案
这是一个死锁问题。
我的程序每次使用扇出模式在 messages
channel 上发送时都使用锁。
问题是,当我在写入超时时返回 err
时,有一个 defer
调用试图锁定相同的 Mutex
.由于我没有得到预期的输出,我认为超时从未触发。
defer func() {
thing.ThatCreatedDeadlock()
log.Println("Expected to see this")
}
因此,直接记录 Write
错误会使这一点显而易见:
n, err := conn.Write(msg.ByteArray())
if err != nil {
log.Println(err)
return err
}
关于networking - TCPConn SetWriteDeadline 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46759513/
我正在用 Go 编写一个 websocket 服务器,用于向客户端广播消息。我在每次发送时都使用 SetWriteDeadline,这样广播循环就不会卡住。 我的问题是:如何解释来自 SetWrite
当我关闭浏览器时,我想在 3 秒而不是 1 分钟内断开 websocket。以下只是继续写入 void 而不会出错,直到我猜的 tcp ip 超时,而不是 SetWriteDeadline。 f :=
我正在用 Golang 编写一个 TCP 客户端。服务器永远不会发送任何回复或任何数据。 一旦我在给定的超时后无法写入,我希望客户端关闭连接。 因此,通过阅读 Conn 中的 SetWriteDead
Go 的 websockets 有一个 SetWriteDeadline() 函数来设置连接的网络写入截止时间。是否需要在每次发送数据前设置,还是在创建连接时设置一次? 最佳答案 要使它有用,请每次都
我试图通过检查 golang TCPConn.Write 返回的错误来检测发送失败,但它是零。我也尝试使用 TCPConn.SetWriteDeadline没有成功。 事情就是这样发生的: 服务器启动
我的 TCP 连接有问题。 我有一个用 go 编写的服务器,它在某个端口上监听 tcp 连接。我有用 Java 为 Android 编写的客户端。客户端与服务器建立连接,然后在没有任何规律的情况下交换
我是一名优秀的程序员,十分优秀!