2012-10-19 6 views
6

Sono nuovo nell'uso di Cloud9 IDE (c9) e finora sembra fantastico, tranne alcune cose minori.Come dichiarare le porte in Cloud9 usando Python

Vedo dai documenti che per avviare un semplice server http node.js, devi passare in process.env.PORT al posto della porta regolare come "8080".

Nodo Ciao Mondo 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); 

Quello che voglio sapere è, in C9, si può iniziare solo servizi sulle porte utilizzando JavaScript/node.js? O altre lingue funzionano altrettanto bene, forse con qualche altro metodo per passare la porta? Specificamente python + Twisted?

Ho caricato un codice per codice che funzionava localmente per me, ma non funzionava su c9 perché stava tentando di accedere alle porte locali (che sono già in uso). Ecco l'errore

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

Come si può far funzionare il seguente esempio, se possibile, in esecuzione su c9?

Python + ritorto Ciao Mondo 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() 

ricerche iniziali attraverso il github issuesdocumentation e non girare molto in su. Spero che sia possibile e ho appena perso il parametro giusto per passare.


Modifica: Aggiornato uscita sotto

Nodo Codice

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

uscita 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 

Python Codice

import os 

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

uscita Terminal

Running Python Process 
8080 
127.6.70.129 

codice ritorto

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

terminale di uscita

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) 

Il listenTCP TypeError è strano perché 2 argomenti funziona in locale ma non su Cloud9. Non vedo perché l'uso di questi argomenti non funzioni.

Ho il codice sopra ospitato su this progetto pubblico Cloud9 per chiunque di dare un'occhiata. Grazie!

risposta

6

process.env.PORT e process.env.IP da Node.js sound likeos.environ["PORT"] e os.environ["IP"] in Python.Forse si può provare:

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

Grazie! I comandi os.environ * stanno * mostrando gli stessi valori dei rapporti node.js. Tuttavia, sembra che Python/Twisted non stiano ancora collegandosi alle porte. Penso che questo sia a causa degli argomenti dati a reactor.listenTCP (che dà un errore), o perché la piattaforma non lo consente. – mrchampe

+0

Scusa, errore nella mia risposta. –

+0

Funziona, grazie mille! – mrchampe

4

Probabilmente questo è limitazione di gestione ambientale C9, in modo Gli utenti non abusare del loro servizio troppo. Suppongo che abbiano un certo livello di gestione per le risorse usate da Node.js e quindi consentono a queste di aprire le porte.

Se questo era il caso e ho avuto di lavorare con cloud9, probabilmente avvicinarsi a questo come segue: - creare il servizio Node.js che agirebbe come un proxy, l'ascolto in nome contorto - Crea un nuovo reattore con overriden dei metodi listenTCP e listenUDP, che li collegano al servizio proxy Node.js.

Il modo in cui il proxy avrebbe funzionato è il seguente, Node.js inizialmente ascolterebbe su una porta TCP "di gestione". Quindi, all'avvio del servizio twisted, creerebbe una connessione TCP tra Node.js e se stessa attraverso quella porta. Quindi, ogni volta che listenTCP o listenUDP viene chiamato, questi comandi vengono quindi inviati al servizio Node.js, che in cambio aprirebbe la porta e tutta la comunicazione attraverso quella porta sarebbe quindi delegata a passare attraverso quella connessione TCP esistente.

+0

Ho pensato la stessa cosa. Ero preoccupato che si potesse scrivere un proxy node.js come suggerito. Tuttavia, con python puoi usare "os.environ" come mostrato nell'altra risposta. Sono d'accordo, tuttavia, che anche se * questo * non è un limite di cloud9, in generale ci sono molte altre limitazioni che rendono certe cose sull'ide problematico. Grazie per i vostri suggerimenti. – mrchampe

2

Vale la pena ricordare che la risposta di Jean-Paul ha lavorato anche per me, ma ho dovuto usare 'indirizzo' invece di 'interfaccia':

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

Sono curioso - stai usando Twisted o un altro framework (bottiglia, tornado, ecc.)? – mrchampe

+0

Sto usando Tornado - grazie, avrei dovuto dirlo. –