2013-05-15 39 views
5

Gần đây tôi đã truy cập trang web heroku.com và cố gắng triển khai chương trình java đầu tiên của tôi ở đó, tôi thực sự đã bắt đầu sử dụng hướng dẫn triển khai java của mình và chạy nó ok. bây giờ tôi có một mã máy chủ mà tôi cần triển khai ở đó, tôi đã cố gắng làm theo ví dụ nhưng tôi đã có một số câu hỏi trong đầu, nhưTriển khai mã máy chủ đơn giản cho Heroku

1- những gì sẽ là máy chủ trong trường hợp này, tôi đã thử liên kết ứng dụng nếu chủ của nó nhưng nó ném lỗi,

đây là mã máy chủ mẫu của tôi

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(); 
     } 
    } 
} 

đây là mã khách hàng của tôi

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); 
    } 
} 

tôi đi theo hướng dẫn này https://devcenter.heroku.com/articles/java tại trang web của họ để tải lên mã máy chủ của tôi là có cái gì khác tôi cần phải làm gì?

cảm ơn trước

Trả lời

5

Trên Heroku, ứng dụng của bạn phải bind to the HTTP port provided in the $PORT environment variable. Do đó, hai vấn đề chính trong mã ứng dụng của bạn ở trên là 1) bạn đang ràng buộc với một cổng được mã hóa cứng (6780) và 2) ứng dụng của bạn đang sử dụng TCP thay vì HTTP. Như đã trình bày trong tutorial, sử dụng giống như Jetty để hoàn thành tương đương HTTP của ứng dụng của bạn và sử dụng System.getenv("PORT") để ràng buộc vào cổng bên phải, như thế này:

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(); 
    } 
} 
+0

ok nhưng sẽ là mã khách hàng một kết nối http bình thường trong này trường hợp ?! đây thực sự là một ví dụ khá đơn giản, những gì tôi thực sự đang làm là xây dựng trò chơi nhiều người mà khách hàng có thể kết nối với máy chủ và chơi để tôi quan tâm đến mã khách hàng ur sau khi thay đổi ur trong mã máy chủ cảm ơn trước? hãy nhớ rằng tôi đang có ý định mở rộng mã để hỗ trợ nhiều người để mọi trợ giúp sẽ được đánh giá cao –

+0

Vâng, khách hàng của bạn cũng sẽ cần sử dụng HTTP. Các ứng dụng Heroku có thể tạo các kết nối TCP gửi đi (ví dụ: đến cơ sở dữ liệu), nhưng tất cả các kết nối gửi đến cần phải qua HTTP. Xem [thông tin về định tuyến HTTP Heroku] (https://devcenter.heroku.com/articles/http-routing) để biết thêm chi tiết. – ryanbrainard