gpt4 book ai didi

java - 在 Java 中,如何编写一个套接字服务器来生成一个新进程来处理请求?

转载 作者:行者123 更新时间:2023-12-01 04:58:02 26 4
gpt4 key购买 nike

我不是在问如何在新创建的线程中处理请求。我问的是如何在新创建的流程中做到这一点,尽管我知道它的缺点。

要 fork 一个进程来处理请求,服务器套接字需要以某种方式将客户端套接字对象传递给子进程。这如何通过?是通过序列化它并将其作为 Runtime.exec() 的参数之一传递吗?

此外,从 TCP 连接的角度来看,我可以想象在客户端进程和衍生进程之间创建了一个新的 TCP 连接。那么这是如何创建的呢?这对客户来说是透明的吗?客户端是否知道会生成一个新进程来处理它?<​​/p>

最佳答案

使用普通 Java 是不可能实现您想要做的事情的:

您无法“序列化”客户端套接字并将其传递到任何地方:Socket不是操作系统的“真实”套接字,它只是一个 Java -side“控制对象”保存一些Java内部信息和操作系统套接字的ID。这个 ID - 取决于操作系统 - 只是一个整数文件句柄。该句柄无法在现有进程1之间传输。在某些操作系统(特别是 Unix 派生的操作系统)上创建新进程(注意小“p”)时,所有打开的文件句柄都会从父进程复制到子进程(新进程)。这包括套接字句柄。然后一个 child 就可以处理这个请求。但并非所有操作系统都支持该机制。 Java 决定仅支持所有受支持的操作系统上可用的内容。这意味着新的Process隐式关闭几乎所有文件句柄,包括套接字内容。运气不好。

此外,您无法以透明方式创建到客户端的新 TCP 连接。一个新的TCP连接就是一个新的TCP连接——它需要连接双方的合作。这与“透明”相反。

<小时/> 1至少在 Java 中不是这样。在 Linux 上,使用纯 C 语言,您可以使用特殊的系统调用来执行此操作。

关于java - 在 Java 中,如何编写一个套接字服务器来生成一个新进程来处理请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13784824/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com