2013-04-20 2 views
0

내 컴퓨터에서 실행되는 python 스크립트가 있습니다. 소켓을 열고받는 모든 것을 인쇄합니다. 이것은 분명히 효과적입니다 - 다른 컴퓨터에서 연결하여 데이터를 전송했습니다.Heroku, 플라스크 및 파이썬 소켓?

문제는 내 heroku 앱이 소켓에 연결되지 않는 것입니다.

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
s.connect((daemon_socket_vars['host'], daemon_socket_vars['port'])) 
s.send("Hi!") 
s.close() 

시간 초과 후 두 번째 줄에서 heroku 앱이 실패합니다. 내 랩톱이나 친구의 랩톱에서 똑같은 것을 실행할 때 (서버로 작동하는 파이썬 스크립트가 두 경우 모두 내 랩톱에서 실행되는 동안) 작동합니다. 왜 heroku가 이것에 문제가 있는지 누구든지 알 수 있습니까? 감사!

+0

IIRC, Heroku는 포트 80 및 443에서만 외부 연결을 허용합니다. – Blender

+0

다른 컴퓨터에서 테스트 할 때 동일한 스크립트를 사용 했습니까? – timss

+0

연결할 수있는 포트의 제한이 _to_에 연결할 수있는 포트에 영향을 줍니까? 내 노트북의 소켓이 포트 50000에서 수신 대기 중입니다. heroku 앱이 사용해야하는 포트를 지정하지 않았습니다. 모든 기계의 파이썬 스크립트는 동일합니다. – bee

답변

1

Heroku에서 실행 중일 때 서버는 환경 변수 PORT에 지정된 포트에 바인드해야합니다 (이 설명의 목적으로 7880). 80, 5000, 8000, 8080 또는 다른 어떤 것이라도 보장되지 않습니다.

외부 세계에, 그러나,이 Heroku가 외부에서 연결하는 경우, 클라이언트가 포트 80

마지막으로주의 연결됩니다입니다 포트 80 또는 포트 443로 나타납니다 : 연결할 때 Heroku 외부에서 클라이언트는 "Heroku Routing Mesh"를 거치게됩니다. "Heroku Routing Mesh"는 80 -> something port "translation"을 수행합니다. 문제는 라우팅 메쉬가 HTTP 라우팅 메쉬라는 것입니다. 들어오는 HTTP 요청 만 받아들이고 헤더를 추가하는 등의 방식으로 경로를 변경합니다.

그래서 Heroku에 일반 소켓 응용 프로그램을 작성하고 직접 연결할 수는 없으므로 HTTP를 전송 수단으로 사용해야합니다.