将简单的服务器代码部署到Heroku

8

我最近访问了heroku.com网站,并尝试在那里部署我的第一个Java程序。我使用他们的Java部署教程有了良好的开端,并且成功运行了它。现在,我有一个需要在服务器上部署的代码,我尝试按照示例进行操作,但是脑海中有一些问题,例如:

1- 在这种情况下,主机将是什么?我已经尝试使用应用程序链接作为主机,但它抛出错误。

以下是我的示例服务器代码:

public class DateServer {

    /** Runs the server. */
    public static void main(String[] args) throws IOException {
        ServerSocket listener = new ServerSocket(6780);
        try {
            while (true) {
                Socket socket = listener.accept();
                try {
                    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                    out.println(new Date().toString());
                } finally {
                    socket.close();
                }
            }
        } finally {
            listener.close();
        }
    }
}

这是我的客户端代码

public class DateClient {

    /** Runs the client as an application. First it displays a dialog box asking for the IP address or hostname of a host running the date server, then connects to it and displays the date that it serves. */
    public static void main(String[] args) throws IOException {
        //I used my serverAddress is my external ip address 
        Socket s = new Socket(serverAddress, 6780);
        BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String answer = input.readLine();
        JOptionPane.showMessageDialog(null, answer);
        System.exit(0);
    }
}

我按照Heroku网站上的教程https://devcenter.heroku.com/articles/java上传了我的服务器代码,还需要做其他事情吗?谢谢。
1个回答

6
在Heroku上,你的应用程序必须绑定到$PORT环境变量提供的HTTP端口。因此,你应用程序代码中存在两个主要问题:1)你正在绑定到一个硬编码端口(6780),2)你的应用程序正在使用TCP而不是HTTP。如教程所示,使用类似Jetty的东西来完成应用程序的HTTP等效操作,并使用System.getenv("PORT")来绑定到正确的端口,就像这样:
import java.util.Date;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.*;

public class HelloWorld extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.getWriter().print(new Date().toString());
    }

    public static void main(String[] args) throws Exception{
        Server server = new Server(Integer.valueOf(System.getenv("PORT")));
        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");
        server.setHandler(context);
        context.addServlet(new ServletHolder(new HelloWorld()),"/*");
        server.start();
        server.join();   
    }
}

好的,但在这种情况下客户端代码将是普通的HTTP连接吗?虽然这只是一个相当简单的例子,但我实际上正在构建一个多人游戏,客户端可以连接到服务器并进行游戏,所以我对您在更改服务器代码后的客户端代码很感兴趣。提前感谢您的帮助,请记住我打算扩展代码以支持多人游戏,因此任何帮助都将不胜感激。 - Aamer
是的,您的客户端也需要使用HTTP。Heroku应用程序可以进行出站TCP连接(例如到数据库),但所有入站连接都需要通过HTTP进行。有关更多详细信息,请参见Heroku HTTP路由信息 - ryanbrainard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接