登录
首页 >  Golang >  Go问答

需要 - 用 golang 编写一个封装器以处理 tcp 服务器和客户端通信

来源:stackoverflow

时间:2024-03-20 19:51:29 127浏览 收藏

在 Go 中使用 `listen/accept` 和 `dial` 处理客户端/服务器通信时,默认情况下无法保证数据传输的完整性。当客户端变得不可用时,`conn.write()` 可能会返回正确的字节长度,但不会设置错误状态。为了解决这个问题,本文探索了创建自定义包装器以实现客户端确认的可能性。通过这种方式,当客户端断开连接时,可以保证 `_err` 被相应设置。

问题内容

在golang中,当您使用服务器上的listen/accept和客户端上的dial进行客户端/服务器组合时,据我所知,向客户端写入实际上并不能保证完整的传输链。 ie 当你说:

_len, _err := conn.write([]byte("sent"))

您发送的文本可能会到达客户端计算机的缓冲区,但不会到达客户端本身。换句话说,如果客户端变得不可用,_err 可能仍然未设置,并且 _len 可能仍然显示正在发送的正确字节长度。我通过终止服务器和客户端之间的连接并手动监视 conn.write() 的返回状态并看到它没有显示错误来注意到这一点。

换句话说,仅仅使用这些开箱即用的工具并不能保证交付,我希望有一个 go 库可以实现客户端确认来确保这一进一步的保证。我想说的是:

_len, _err := _write(conn, "sent\n")

并且保证如果客户端离开,_err 将被相应设置 - 假设发送和客户端确认之间有特定的超时。

有这样的标准库吗?我可以编写自己的包装器来执行此操作,但我感觉正确执行此操作的逻辑会有些复杂。

再次感谢您提供任何信息,

编辑


解决方案


没有为此的标准库。如何完成应用程序级别的确认是在特定的应用程序协议中指定的,即 HTTP(Web)、SMTP(邮件传递)、SIP(VoIP)等协议。并且该协议必须在客户端和服务器中都使用。如果某些应用程序级确认不是协议规范的一部分并且服务器不会显式发送它,则客户端无法强制执行某些应用程序级确认。

因此,您需要选择一个支持您需要的语义的应用程序协议,并在客户端和服务器上使用它。或者您需要定义自己的应用程序协议,该协议支持您需要的确切语义,并在双方自行实现。

以上就是《需要 - 用 golang 编写一个封装器以处理 tcp 服务器和客户端通信》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>