我没有问如何在新创建的线程中处理请求。我问的是如何在新创建的过程中做到这一点,尽管我知道它的缺点。
要分叉进程来处理请求,服务器套接字需要以某种方式将客户端套接字对象传递给子进程。这怎么过?它是通过序列化并将其作为Runtime.exec()
的参数之一传递的吗?
此外,从TCP连接的角度来看,我可以想象在客户端进程和生成的进程之间创建了一个新的TCP连接。那怎么创造的呢?这对客户来说是透明的吗?客户是否知道产生了一个新流程来处理它?</ p>
答案 0 :(得分:0)
使用普通Java无法实现您的目标:
你无法“序列化”客户端套接字并将其传递到任何地方:Socket
类不是操作系统的“真正”套接字,它只是一个Java端“控制对象“持有一些Java内部信息和操作系统套接字的 ID 。此ID - 取决于操作系统 - 只是一个整数文件句柄。此句柄不能在现有流程 1 之间传输。在某些操作系统上创建一个新进程(注意小'p')时,特别是Unix派生的进程,所有打开的文件句柄都从父对象复制到子进程(新进程)。这包括套接字句柄。然后孩子可以处理请求。但是所有操作系统都不支持该机制。 Java决定只支持所有支持的操作系统上可用的东西。这意味着新的Process
隐式关闭几乎所有文件句柄,包括套接字内容。运气不好。
此外,您无法以透明方式创建与客户端的新TCP连接。新的TCP连接是一种新的TCP连接 - 它需要在连接的两端进行协作。这与“透明”相反。
<小时/> 1 至少不是Java。使用普通的C和Linux,您可以使用特殊的系统调用来执行此操作。