从HTTP服务器收到响应后保持连接活动

时间:2009-09-18 04:29:14

标签: http client-server

我有一个客户端 - 服务器系统,客户端需要分叉子进程,并将其pid返回给服务器。在此之后,它必须保持与服务器的连接,通过该连接,它不断发送有关子进程的服务器日志信息以及它可能希望作为调试信息的一部分发送的其他请求。

我的问题是,如何做到这一点?我是否每次都与服务器建立连接,发送pid并要求它记录请求[因为我可以让多个客户端同时向服务器发送请求],还是有其他方法可以做到这一点?

2 个答案:

答案 0 :(得分:2)

您需要更清楚流程结构,而不是现在。服务器进程是否独立于客户端进程保持活动状态?它是在听一个众所周知的端口号吗?客户端的第一个(父)进程何时连接到服务器?

您说客户端分叉一个孩子,然后让服务器知道子PID。孩子是否也与服务器通信?它是否打开与服务器的独立连接,或者它是否抢占父进程的连接,还是让子进程和父进程尝试共享到服务器的单个连接?如何协调单一连接的访问​​?

这种系统的一个常见设置是:

  • 服务器进程作为守护程序启动,该守护程序侦听已知或配置的端口。
  • 初始客户端(父)进程建立与服务器的连接。
  • 辅助客户端(子)进程断开继承的连接并建立自己与服务器的连接。

连接有两种操作模式:

  1. 客户端进程打开连接,写入消息,可能等待响应,并且每次都关闭连接。这是Web浏览器使用的机制,因为Web提供无状态连接。
  2. 客户端进程打开连接并保持打开状态(服务器不会关闭连接,直到出现紧急情况或客户端同意(或请求)关闭它。此机制通常由连接到的数据库客户端使用。数据库服务器。
  3. 两种模式都有效 - 它们对开销有不同的影响(每次连接需要很长时间)和资源使用(持久连接在服务器中占用更多资源;客户端不会受到严重影响)。

答案 1 :(得分:1)

如果客户端和服务器之间没有超时的状态防火墙/ NAT,则TCP连接将无限期地持续,不需要发送任何数据。您可以设置一些套接字选项,定期发送不包含任何数据的数据包(如果没有收到响应,则断开连接) - 搜索SO_KEEPALIVE

如果您正在谈论一些特定的HTTP服务器,它可能有一个选项,允许连接在没有任何请求的情况下持续多长时间,例如:在apache中KeepAliveTimeout