我不是在问如何在新创建的线程中处理请求。我问的是如何在新创建的流程中做到这一点,尽管我知道它的缺点。
为了分叉一个进程来处理请求,服务器套接字需要以某种方式将客户端套接字对象传递给子进程。那是如何通过的?是通过序列化它并将其作为 的参数之一传递Runtime.exec()
吗?
另外,从 TCP 连接的角度来看,我可以想象在客户端进程和衍生进程之间创建了一个新的 TCP 连接。那么这是如何创建的呢?这对客户透明吗?客户是否知道产生了一个新进程来处理它?
我不是在问如何在新创建的线程中处理请求。我问的是如何在新创建的流程中做到这一点,尽管我知道它的缺点。
为了分叉一个进程来处理请求,服务器套接字需要以某种方式将客户端套接字对象传递给子进程。那是如何通过的?是通过序列化它并将其作为 的参数之一传递Runtime.exec()
吗?
另外,从 TCP 连接的角度来看,我可以想象在客户端进程和衍生进程之间创建了一个新的 TCP 连接。那么这是如何创建的呢?这对客户透明吗?客户是否知道产生了一个新进程来处理它?
使用纯 Java 无法实现您想要做的事情:
您不能“序列化”客户端套接字并将其传递到任何地方:Socket
该类不是操作系统的“真实”套接字,它只是一个 Java 端“控制对象”,其中包含一些 Java 内部信息和操作的ID系统插座。这个 ID - 取决于操作系统 - 只是一个整数文件句柄。此句柄无法在现有进程之间转移1. 在某些操作系统(尤其是 Unix 派生的操作系统)上创建新进程(注意小“p”)时,所有打开的文件句柄都会从父进程复制到子进程(新进程)。这包括套接字句柄。然后一个孩子可以处理这个请求。但并非所有操作系统都支持该机制。Java 决定只支持在所有支持的操作系统上可用的东西。这意味着 newProcess
隐式关闭几乎所有文件句柄,包括套接字内容。厄运。
此外,您不能以透明的方式创建到客户端的新 TCP 连接。一个新的 TCP 连接就是一个新的 TCP 连接——它需要连接双方的合作。这与“透明”相反。