我开始在一段时间内使用golang进行项目。在我的项目中,我必须实现响应tcp客户端的tcp服务器。服务器必须向客户端发送许多消息。
问题是当服务器将消息写入客户端连接时,它必须等到客户端从缓冲区读取该消息然后发送另一条消息(服务器必须等到客户端调用reader.ReadString('\n')
方法)。
在我写的服务器代码中:
for {
data := <-client.outgoing
client.writer.WriteString(data + "\n")
client.writer.Flush()
}
但服务器将所有消息发送到客户端,而不等待客户端中的ReadString。
如何使服务器等到客户端读取消息然后发送其他消息?
答案 0 :(得分:0)
我认为作业不明确,或者你误解并解决the XY problem。
简短的回答是您永远无法知道客户端是否仅通过查看TCP会话来阅读消息。您必须在应用程序中实现此“协议”。
以下是一些问题:
从您的应用程序中,您 无法访问TCP正在执行的操作。您将获得可以执行I / O的流。
ioctl
s,SIOCINQ
,SIOCOUTQ
或各种setsockopts):这些无法帮助即使您发现TCP正在做什么,这只会告诉您远程TCP正在做什么。因此,如果您可以完全控制TCP,甚至可以看到来自同行的确认,那么您仍然不知道应用程序正在做什么。应用程序很可能还没有读取数据(它可能没有请求数据,TCP可能会因为一些奇怪的原因而将其隐藏在缓冲区中,调度程序可能没有安排远程进程等。)
回到你的问题,一种真正了解远程应用程序是否收到你的消息的方法是让远程应用程序告诉你。这意味着您必须将协议重组为: