我正在Linux机器上运行一台用Java编写的服务器(可能是Minecraft服务器,也可能不是Minecraft服务器),我想使用systemd套接字按需启动它。为了做到这一点,我将需要从systemd接受一个已经创建的套接字对象。这很容易-只需从C代码中调用sd_listen_fds(0)
来确认我们确实有一个套接字,然后将文件描述符3视为套接字,然后开始接受连接即可(或设置Accept = Yes并将套接字通过a通往实际服务器进程的大门)-但最困难的部分是一旦我们将其返回给Java,就传递该套接字。拥有java.io.FileDescriptor很容易(只需不带任何参数实例化它,并将“ fd”属性设置为int),但是从那儿进入套接字是我的坚持。您可以从SocketImpl创建一个Socket,并且SocketImpl对象具有类型为FileDescriptor的fd属性,但是我不知道如何获取SocketImpl实例,也不知道创建后设置fd属性是否安全。