有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中,如何编写生成新进程来处理请求的socket服务器?

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

为了分叉一个进程来处理请求,服务器socket需要以某种方式将客户机socket对象传递给子进程。这是怎么通过的?它是通过序列化它并将其作为Runtime.exec()的参数之一传递的吗

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


共 (1) 个答案

  1. # 1 楼答案

    普通Java不可能实现您想要的功能:

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

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


    1至少在Java中不是这样。在纯C和Linux上,您可以使用特殊的系统调用来实现这一点。