Java - 通过 server/client 架构托管文件
Java - Hosting a file via server/client architecture
我一直无法找到有关如何使用简单的 Java 服务器托管 .jar 文件的信息。基本上,我正在 Java 中编写一个 2D 游戏,我想创建一个启动器,如果存在互联网访问权限,它将在启动时检查最新版本并在必要时下载最新版本。现在,我知道我可以使用文件共享站点,只需安装最新版本并从那里下载启动器;我只是碰巧发现将文件托管在我自己 运行 的 Java 服务器上的冗余性更加令人满意。
所以基本上,我的问题是:我如何创建一个 Java 服务器来托管最新版本的 .jar 文件,当传入连接请求它时,服务器将整个文件发送到客户端 PC ?
此外,请忽略有关下载 整个 游戏 .jar 可能效率低下的任何顾虑,因为游戏将非常小。我可以预见的唯一下载量过大的威胁是音乐;但是,我可以为音乐文件创建一个单独的请求,并且只获取需要的内容。如果图形资产也成为问题,情况也是如此,但 16x16 纹理不会让我觉得有可能成为障碍。
如果您愿意获取代码签名证书,可以使用 WebStart
检查 Java WebStart - 这涵盖了您有关检查和下载的所有需求。
构建一个简单的网络应用程序,其中包含/托管两个内容:您的 .jnlp(Web 启动描述符文件)和您的游戏 .jar
使用有效的代码签名证书对您的 jar 进行签名(这是 webstart 所必需的)
将您的 webapp 或 jnlp/jar 组合部署到您可以使用的任何网络服务器上。由于您只上传两个文件,因此有很多 "free" 网站托管站点,您可以在其中上传一些文件。
如果你真的非常喜欢 运行 自己下载服务器,你应该看看 Tomcat 或 Jetty 或 运行 Java SE HttpServer 之类的这个:
public static void main(String[] args) throws Exception {
HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
server.createContext("/game.jnlp", new FileHandler("game.jnlp"));
server.createContext("/game.jar", new FileHandler("game.jar"));
server.setExecutor(null);
server.start();
}
static class FileHandler implements HttpHandler {
String file = "";
public FileHandler(String string) {
file = string;
}
@Override
public void handle(HttpExchange t) throws IOException {
byte[] data = IOUtils.toByteArray(getClass().getResourceAsStream(file));
t.sendResponseHeaders(200, data.length);
OutputStream os = t.getResponseBody();
os.write(data);
os.close();
}
}
如果您认为 Webstart 太过分了(我理解您的情况),您需要在客户端中安装两个 jar 文件:一个用于检查和下载另一个,然后启动新加载的文件。步骤顺序为:
- 检查 .jar 是否可以通过网络访问。
- 如果是,加载它并存储在定义的路径
- 启动一个新的 java 进程 (-> ProcessBuilder) 到 运行 java-program
- 等待游戏完成(下载程序将在之后立即完成)
在这种情况下,您的服务器只需要托管 game.jar
我一直无法找到有关如何使用简单的 Java 服务器托管 .jar 文件的信息。基本上,我正在 Java 中编写一个 2D 游戏,我想创建一个启动器,如果存在互联网访问权限,它将在启动时检查最新版本并在必要时下载最新版本。现在,我知道我可以使用文件共享站点,只需安装最新版本并从那里下载启动器;我只是碰巧发现将文件托管在我自己 运行 的 Java 服务器上的冗余性更加令人满意。
所以基本上,我的问题是:我如何创建一个 Java 服务器来托管最新版本的 .jar 文件,当传入连接请求它时,服务器将整个文件发送到客户端 PC ?
此外,请忽略有关下载 整个 游戏 .jar 可能效率低下的任何顾虑,因为游戏将非常小。我可以预见的唯一下载量过大的威胁是音乐;但是,我可以为音乐文件创建一个单独的请求,并且只获取需要的内容。如果图形资产也成为问题,情况也是如此,但 16x16 纹理不会让我觉得有可能成为障碍。
如果您愿意获取代码签名证书,可以使用 WebStart
检查 Java WebStart - 这涵盖了您有关检查和下载的所有需求。
构建一个简单的网络应用程序,其中包含/托管两个内容:您的 .jnlp(Web 启动描述符文件)和您的游戏 .jar
使用有效的代码签名证书对您的 jar 进行签名(这是 webstart 所必需的)
将您的 webapp 或 jnlp/jar 组合部署到您可以使用的任何网络服务器上。由于您只上传两个文件,因此有很多 "free" 网站托管站点,您可以在其中上传一些文件。
如果你真的非常喜欢 运行 自己下载服务器,你应该看看 Tomcat 或 Jetty 或 运行 Java SE HttpServer 之类的这个:
public static void main(String[] args) throws Exception {
HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
server.createContext("/game.jnlp", new FileHandler("game.jnlp"));
server.createContext("/game.jar", new FileHandler("game.jar"));
server.setExecutor(null);
server.start();
}
static class FileHandler implements HttpHandler {
String file = "";
public FileHandler(String string) {
file = string;
}
@Override
public void handle(HttpExchange t) throws IOException {
byte[] data = IOUtils.toByteArray(getClass().getResourceAsStream(file));
t.sendResponseHeaders(200, data.length);
OutputStream os = t.getResponseBody();
os.write(data);
os.close();
}
}
如果您认为 Webstart 太过分了(我理解您的情况),您需要在客户端中安装两个 jar 文件:一个用于检查和下载另一个,然后启动新加载的文件。步骤顺序为:
- 检查 .jar 是否可以通过网络访问。
- 如果是,加载它并存储在定义的路径
- 启动一个新的 java 进程 (-> ProcessBuilder) 到 运行 java-program
- 等待游戏完成(下载程序将在之后立即完成)
在这种情况下,您的服务器只需要托管 game.jar