2012-10-19 13 views
6

Jestem nowy w użyciu Cloud9 IDE (c9) i jak na razie wygląda świetnie, z wyjątkiem kilku drobnych rzeczy.Jak deklarować porty w Cloud9 używając Pythona

Widzę z dokumentów, że aby uruchomić prosty serwer http node.js, musisz przekazać process.env.PORT zamiast zwykłego portu, takiego jak "8080".

Węzeł Hello World example:

var http = require('http'); 
http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
}).listen(process.env.PORT, process.env.IP); 

Co chcę wiedzieć jest, na C9, można rozpocząć jedynie na portach usługi przy użyciu JavaScript/node.js? Czy inne języki działają równie dobrze, być może z inną metodą przejścia przez port? Specyficznie python + Twisted?

Przesłałem trochę skręcony kod, który działał dla mnie lokalnie, ale nie działał na c9, ponieważ próbował uzyskać dostęp do lokalnych portów (które są już w użyciu). Tutaj jest błąd

twisted.internet.error.CannotListenError: Couldn't listen on any:8080: [Errno 98] Address already in use. 

Jak należałoby zrobić następującą przykładową pracę, jeśli w ogóle możliwe, działa na c9?

Python + Twisted Hello World example

from twisted.web import server, resource 
from twisted.internet import reactor 

class Simple(resource.Resource): 
    isLeaf = True 
    def render_GET(self, request): 
     return "<html>Hello, world!</html>" 

site = server.Site(Simple()) 
reactor.listenTCP(8080, site) 
reactor.run() 

wyszukiwania Wstępne poprzez documentation i github issues nie odwrócił znacznie w górę. Mam nadzieję, że to możliwe i właśnie przegapiłem właściwy parametr do przekazania.


Edycja: Zaktualizowany wyjście poniżej

Kod Węzeł

console.log(process.env.PORT) 
console.log(process.env.IP) 

wyjście Terminal

Running Node Process 
Tip: you can access long running processes, like a server, at 'http://private-cloud.mrchampe.c9.io'. 
Important: in your scripts, use 'process.env.PORT' as port and 'process.env.IP' as host. 
8080 
127.6.70.129 

Kod Python

import os 

print os.environ["PORT"] 
print os.environ["IP"] 

wyjście Terminal

Running Python Process 
8080 
127.6.70.129 

Twisted Kod

import os 
import twisted 

from twisted.web import server, resource 
from twisted.internet import reactor 

class Simple(resource.Resource): 
    isLeaf = True 
    def render_GET(self, request): 
     return "<html>Hello, world!</html>" 

site = server.Site(Simple()) 

reactor.listenTCP(int(os.environ["PORT"]), interface=os.environ["IP"]) 
reactor.run() 

Wyjście Terminal

Running Python Process 
hello world 
Traceback (most recent call last): 
    File "python/hello.py", line 17, in <module> 

reactor.listenTCP(int(os.environ["PORT"]), interface=os.environ["IP"]) 
TypeError: listenTCP() takes at least 3 non-keyword arguments (2 given) 

listenTCP TypeError jest dziwne, bo 2 argumenty działa lokalnie, ale nie na Cloud9. Nie rozumiem, dlaczego używanie tych argumentów nie działa.

Mam powyższy kod hostowany na this publicznego projektu Cloud9, aby każdy mógł go obejrzeć. Dzięki!

Odpowiedz

6

process.env.PORT i process.env.IP od node.js sound likeos.environ["PORT"] i os.environ["IP"] w Pythonie.Być może możesz spróbować:

reactor.listenTCP(int(os.environ["PORT"]), site, interface=os.environ["IP"]) 
+0

dzięki! Komendy os.environ * wyświetlają * te same wartości, co raporty node.js. Jednak wydaje się, że Python/Twisted nadal nie są wiążące dla portów. Myślę, że dzieje się tak albo z powodu argumentów podanych dla reactor.listenTCP (które daje błąd), albo dlatego, że platforma na to nie pozwala. – mrchampe

+0

Przepraszamy, pomyłka w mojej odpowiedzi. –

+0

To działa, dziękuję bardzo! – mrchampe

4

Prawdopodobnie jest to ograniczenie zarządzania środowiskiem c9, więc użytkownicy nie nadużywają swojej usługi zbyt wiele. Zakładam, że mają pewien poziom zarządzania zasobami używanymi przez Node.js, co pozwala im otwierać porty.

Jeśli tak było, a ja miał pracować Cloud9, prawdopodobnie podejść do tego w sposób następujący: - stworzyć usługę node.js która będzie działać jako serwer proxy, słuchając na skręconej imieniu - tworzenie nowego reaktora z nadpisanymi metodami listenTCP i listenUDP, które wiązałyby je z usługą proxy Node.js.

Sposób działania serwera proxy wygląda następująco: Node.js początkowo będzie nasłuchiwał na jednym porcie TCP "zarządzania". Następnie, po uruchomieniu usługi skręconej, utworzyłoby połączenie TCP między Node.js a samym przez ten port. Następnie, za każdym razem, gdy zostanie wywołany parametr listenTCP lub listenUDP, komendy te zostaną wysłane do usługi Node.js, która w zamian otworzy port i cała komunikacja przez ten port zostanie przekierowana przez istniejące połączenie TCP.

+0

Myślałem to samo. Obawiałem się, że może być konieczne napisanie proxy node.js, zgodnie z sugestią. Jednak w python można użyć "os.environ", jak pokazano w innej odpowiedzi. Zgodziłbym się jednak, że nawet jeśli * to * nie jest ograniczeniem chmury9, to w ogólności istnieje wiele innych ograniczeń, które sprawiają, że pewne rzeczy na idee są kłopotliwe. Dziękuję za sugestie. – mrchampe

2

Warto wspomnieć, że odpowiedź Jean-Paul pracował również dla mnie, ale musiałem użyć „adres” zamiast „interfejs”:

http_server.listen(int(os.environ.get("PORT")), address=os.environ["IP"]) 
+0

Jestem ciekawy - czy używasz Twisted lub innego frameworka (butelka, tornado, itp.)? – mrchampe

+0

Używam Tornado - dzięki, powinienem to wspomnieć. –