2013-02-20 37 views
7

में पोर्ट नंबर पुनर्प्राप्त करना प्रश्न यह है कि: मैं जिस पोर्ट नंबर को खेल रहा हूं उसे पुनर्प्राप्त कैसे कर सकता हूं, इससे कोई फर्क नहीं पड़ता कि यह कैसे परिभाषित किया गया था (कॉन्फ़िगरेशन, कमांड लाइन तर्क, या बिल्कुल नहीं)।Play Framework 2 एप

यह उत्तर Retrieving port number in-application using Play Framework प्ले v1 के लिए होना चाहिए क्योंकि वह कोड संकलित नहीं होता है।

प्ले 2 में जावा है:

Integer port = Play.application().configuration().getInt("http.port"); 

कि वास्तविक पोर्ट संख्या वापस नहीं करता है, कम से कम नहीं सभी मामलों में। प्ले के रूप में चलाया जाता है, तो:

run 80 -Dhttp.address=example.com 

तो यह null देता है।

तो कृपया Play

run -Dhttp.port 80 -Dhttp.address=example.com 

रूप में चलाया जाता तब डिफ़ॉल्ट पोर्ट (9000) पर शुरू होता है खेलते हैं।

रूप biesior ने बताया यह बंदरगाह दो बार उल्लेख करते हुए काम करता है:

play -Dhttp.port=80 "run 80" 

कौन सा कोर्स के इष्टतम के बाद से एक क्या खेलते हैं वास्तव में उपयोग करता है, और अन्य यह क्या रिपोर्ट है नहीं है।

लेकिन यह देव मोड के लिए मेरे प्रश्न का उत्तर देगा। हालांकि, जैसा कि प्रलेखन कहता है, प्रोड में run का उपयोग करके कभी भी चलाया जाना चाहिए। तो start कमांड के बराबर क्या है, और क्या कोई बेहतर, सुरक्षित तरीका नहीं है? (मैं जावा संस्करण में दिलचस्पी रखता हूँ, लेकिन दूसरों स्काला के बारे में भी जानना पसंद कर सकते।)

+0

बस एक नोट ... आपको वास्तव में पोर्ट 80 (कम से कम यूनिक्स पर) नहीं चलाया जाना चाहिए। क्योंकि इसके लिए आपको रूट के रूप में चलाने की आवश्यकता है और यह करने के लिए एक सुरक्षित बात नहीं है। –

उत्तर

3

देव मोड में चल रहा है आप दोगुनी संकेतन का उपयोग करने के लिए

play -Dhttp.port=80 "run 80" 

दुर्भाग्य से आप है डिफ़ॉल्ट के लिए भी ऐसा ही करने की जरूरत है पोर्ट

play -Dhttp.port=9000 "run 9000" 

तो मैं सिर्फ सभी आवश्यक पैरामीटर के साथ आसान शुरुआती के लिए खोल स्क्रिप्ट (या Windows में .bat) लिखने के लिए सुझाव देते हैं।

+1

उत्पादन में, 'स्टार्ट' कमांड (कोई तर्क नहीं) का उपयोग करके, मुझे अभी भी वास्तविक '9000' के बजाय 'शून्य' मिलता है। –

0

मैं प्ले के सुनो पोर्ट को निर्धारित करने के लिए इस स्काला स्निपेट का उपयोग कर रहा हूं। दुर्भाग्यवश मुझे -Dhttp.port=... निर्दिष्ट नहीं होने पर, कुछ डिफ़ॉल्ट मानों को हार्ड कोड करना पड़ा।

val listenPort = 
    if (!Play.isTest) { 
    System.getProperty("http.port", "9000") 
    } 
    else { 
    // Not on classpath: play.api.test.Helpers.testServerPort 
    // Instead, duplicate its implementation here: 
    System.getProperty("testserver.port", "19001") 
    } 

मुझे आश्चर्य है कि कोई बेहतर तरीका नहीं है, उदाहरण के लिए Play.port लेकिन मैं कुछ भी नहीं मिला है - अच्छी तरह से अपने प्रश्न :-)

के लिए छोड़कर (अपने उदाहरण में, यह -Dhttp.port=80 नहीं -Dhttp.port 80 होना चाहिए।)

0

मैं सिर्फ बंदरगाह चाहे कितना पाने के लिए एक रास्ता मिल गया बंदरगाह निर्दिष्ट है। कॉल ऑब्जेक्ट प्राप्त करने के लिए रिवर्स रूट का उपयोग करें, और पोर्ट को शामिल करने वाली आपकी क्रिया का पूर्ण यूआरएल प्राप्त करने के लिए absoluteUrl() विधि का उपयोग करें। कोड स्निपेट:

public class RouteController extends Controller { 
public Promise<Result> getPortAction() { 
    Call call = com.mycom.routes.RouteController.getPortAction(); 
    String absoluteUrl = call.absoluteURL(request()); 
    //Here absoluteUrl would be like http://localhost:9002/...., 9002 would be the port. 
    ... 
} } 
+1

यदि आप इस कोड नमूना को परिशोधित कर सकते हैं तो मैं आपकी प्रतिक्रिया को बढ़ा दूंगा। जैसा कि आप इंगित करते हैं, कॉन्फ़िगरेशन से पूछताछ करने के लिए यह सबसे अच्छा _not_ है। पोर्ट नंबर की तलाश करते समय। सिद्धांत रूप में, आपका आदर्श उत्तर है, लेकिन मैं इसे काम करने में सक्षम नहीं था। –

+0

यह "absoluteURL()" विधि के रूप में बिल्कुल मदद नहीं करता है, वास्तव में केवल यूआरआई के स्थानीय पथ खंड की गणना करता है। सर्वर और पोर्ट को या तो "absoluteURL()" के पैरामीटर जो भी निहित या सेट किया गया है। –