在哪个 IP 上托管 http 服务器? (Heroku,没有框架)

Posted

技术标签:

【中文标题】在哪个 IP 上托管 http 服务器? (Heroku,没有框架)【英文标题】:On which IP to host an http server? (Heroku, no frameworks) 【发布时间】:2022-01-14 10:56:35 【问题描述】:

我可以在 heroku 上的哪个 IP 上托管我的 http 服务器(纯 java)? Heroku 为 web 应用提供的应用的 IP 是否合适?如果是,那么如果需要,请帮我设置 Procfile。

我的 Procfile:worker: java -jar (name of jar file).jar

我的 1-class 代码:

package discord.wosaj;

import com.sun.net.httpserver.HttpServer;

import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.net.URLDecoder;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

import static java.util.stream.Collectors.*;

public class Main 
    public static void main(String[] args) throws IOException 
        HttpServer server = HttpServer.create(new InetSocketAddress("https://rests-server.herokuapp.com", 80), 0);
        server.createContext("/api/hello", httpExchange -> 
            if(httpExchange.getRequestMethod().equals("GET")) 
                String out = "<head><meta charset=\"UTF-8\"></head>\n" +
                        "<h1>Params:</h1>" +
                        Main.splitQuery(httpExchange.getRequestURI().getRawQuery());
                httpExchange.sendResponseHeaders(200, out.getBytes().length);
                OutputStream stream = httpExchange.getResponseBody();
                stream.write(out.getBytes());
                stream.flush();
                stream.close();
             else 
                httpExchange.sendResponseHeaders(405, -1);
            
        );
        server.setExecutor(null);
        server.start();
    

    public static Map<String, List<String>> splitQuery(String query) 
        if (query == null || "".equals(query)) 
            return Collections.emptyMap();
        

        return Pattern.compile("&").splitAsStream(query)
                .map(s -> Arrays.copyOf(s.split("="), 2))
                .collect(groupingBy(s -> decode(s[0]), mapping(s -> decode(s[1]), toList())));
    

    private static String decode(final String encoded) 
        try 
            return encoded == null ? null : URLDecoder.decode(encoded, "UTF-8");
         catch (final UnsupportedEncodingException e) 
            throw new RuntimeException("UTF-8 is a required encoding", e);
        
    

我试过0.0.0.0,它启动了,但不清楚向哪个地址发出请求

端口由环境变量“PORT”决定

【问题讨论】:

我不明白。您认为 IP 地址在哪些方面可能不合适? 它可以是动态的,所以它可以与前面提到的procfile一起使用,还是只用于web应用程序? 是的,Heroku IP 地址是动态的。但许多网络托管服务提供商都是如此。它不会阻止您使用它们。您只需要正确设置 DNS。 Heroku 用于很多 网络应用程序。基本上就是这样。 ...我不需要绑定域,我需要打开一个HttpServer并在其中指定一个IP地址,动态不接受 请显示您正在执行此操作的代码。我怀疑您在侦听连接和测功机的公共 IP 地址之间感到困惑。 【参考方案1】:

已经找到了解决办法,但我还是会写: 将 ip 设置为 0.0.0.0 并将端口设置为 PORT 环境变量,在 procfile 中将其设置为 web,它应该可以工作

【讨论】:

以上是关于在哪个 IP 上托管 http 服务器? (Heroku,没有框架)的主要内容,如果未能解决你的问题,请参考以下文章

哪个引擎可以在 Google Cloud 上托管 perforce 服务器?

在 IP 和端口上托管节点服务器

如何在具有不同域的同一 IP/服务器上托管多个 Node.js 站点?

在一个 IP 上托管多个 Golang 站点并根据域请求提供服务?

在具有 80 端口的 IIS 上托管 2 个网站 1,在 Xampp 8081 端口上托管 1 个网站

可以在 TCP 打孔后打开的端口上托管 HTTP/HTTPS 服务器吗?