这个问题可能略有主题,但我不知道在哪里问。我正在阅读此https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md,并看到规范包括能够使用相同的连接发送订单消息。
我之前完成的TCP套接字编程的唯一方法是在插座上同步发送请求,例如,我将向127.0.0.1
打开一个套接字,通过该套接字向该服务器发送请求并等待响应。当我收到请求的响应时,我发送了我发送的连接,我通过在客户端上调用close()
并在我响应请求后在服务器上拨打close()
。
对于背景,我正在使用libevent
的C 项目进行一个与RPC系统相似的事情,因此我想知道我应该在基础传输系统中使用什么请求响应套接字周期。
在C 节省中,有一种称为open()
的客户端方法(大概(打开连接并保持打开状态,直到您致电close()
。这如何在抽象的系统中起作用?例如,在该MessagePack-RPC链接中,我已包含上面的内容。最好的行动是什么?如果没有,请打开连接,请发送请求,并且当所有先前的请求都关闭时(在服务器上,在响应所有待处理请求时,请致电close()
(?还是我们必须以某种方式尝试在一段时间内保持这种连接的生命,从而超出了请求寿命?服务器和客户端将如何知道该时间段是什么?例如,我们应该在插座上注册一个读取事件处理程序,并在recv()
返回0
时关闭连接?
如果这是一个不同的系统解决不同的问题,那么有人可以将我引导到我可以用来阅读可能的模式以保持连接生存的模式(最好是在事件驱动的系统中(?例如,我读到HTTP服务器始终保持连接开放,为什么?是否保持每个连接的打开都不意味着服务器本质上会泄漏内存?
对不起,看似基本的问题,我以前只做过非常简单的TCP插座编程,所以我可能不知道事情是如何完成的。
- 在客户端使用连接池。
- 客户端中有一个背景线程,可以在超时后到期闲置连接。
- 编写服务器,以便它可以在每个接受的套接字上处理多个请求,即循环读取请求并发送响应,直到同伴关闭连接或读取超时会读取请求或发生插座错误。 >
- 不要从任何一侧发送密切的消息。靠近插座就足够了。
- 不要使用应用程序ping消息来保持连接的生命。如果同行或中间路由器认为连接昂贵以至于在一段时间后终止它们,那么您没有任何业务试图欺骗它。
所有这些都是大多数HTTP实现已经起作用的方式。请注意两端的超时以控制两端的空闲资源用法。