1

新しく作成されたスレッドでリクエストを処理する方法を尋ねていませんでした。私はその欠点を知っていますが、新しく作成されたプロセスでそれを行う方法について尋ねていました。

リクエストを処理するプロセスを fork するために、サーバー ソケットは何らかの形でクライアント ソケット オブジェクトを子プロセスに渡す必要があります。それはどのように通過しますか?それをシリアライズして引数の1つとして渡すことRuntime.exec()ですか?

また、TCP 接続の観点からは、クライアント プロセスと生成されたプロセスの間に新しい TCP 接続が作成されることが想像できます。では、これはどのように作成されるのでしょうか。これはクライアントに対して透過的ですか? クライアントは、それを処理するために新しいプロセスが生成されたことを知っていますか?

4

1 に答える 1

0

プレーンJavaでは、やりたいことは不可能です。

クライアントソケットを「シリアル化」してどこにでも渡すことはできませんSocket。クラスはオペレーティングシステムの「実際の」ソケットではなく、Java内部の情報とオペレーティングシステムのIDを保持するJava側の「制御オブジェクト」にすぎません。システムソケット。このIDは、オペレーティングシステムによって異なりますが、整数のファイルハンドルです。このハンドルは、既存のプロセス間で転送できません1。一部のオペレーティングシステム、特にUnix派生システムで新しいプロセス(小さな「p」に注意)を作成すると、開いているすべてのファイルハンドルが親から子に複製されます(新しいプロセス)。これには、ソケットハンドルが含まれます。その後、子供はリクエストを処理できます。ただし、そのメカニズムはすべてのオペレーティングシステムでサポートされているわけではありません。Javaは、サポートされているすべてのオペレーティングシステムで利用できるものだけをサポートすることを決定しました。これは、newProcessがソケットのものを含むほとんどすべてのファイルハンドルを暗黙的に閉じることを意味します。不運。

また、透過的な方法でクライアントへの新しいTCP接続を作成することはできません。新しいTCP接続は新しいTCP接続であり、接続の両側で協力する必要があります。これは「透明」の反対です。


1少なくともJavaではありません。プレーンCおよびLinuxでは、特別なシステムコールを使用してこれを行うことができます。

于 2012-12-09T10:22:00.667 に答える