如何 运行 非网络 Python Heroku 中的 Twisted 脚本

How to run non-web Python Twisted script in Heroku

会有懂Heroku和twisted的人吗?

我在自己的电脑上测试过扭曲的代码

客户端调用服务器时

服务器将return消息发送给客户端

我的目的是把服务器放在heroku上,让客户端调用它和return消息,不用用web。

问题

当我将服务器代码移至 Heroku 时

  1. 如何启动server.py?

  2. 如何在client.py中设置ip?

我使用 git 从 Getting Started on Heroku with Python

克隆 heroku 官方代码

下载后我做的步骤

  1. 在requirements.txt

  2. 中增加twisted == 1.6.0
  3. 在Procfile中增加worker: python server.py runserver 0.0.0.0: 5000(server.py是乱码)

3.git push heroku master

  1. 转到资源页面开始worker: python manage.py runserver 0.0.0.0:5000

已尝试client.py ("0.0.0.0", 5000, f)中的connectTCP设置,但没有响应

点击打开app时会出现错误信息(不过我没用过网站....)

查看日志

at=error code=H14 desc="No web processes running" method=GET path="/" host=bitserver.herokuapp.com request_id=778e3bd2-310d-4d8d-aa75-737a1d89efdc fwd="220.130.40.2" dyno= connect= service= status=503 bytes=

脚本信息

server.py
from twisted.internet import protocol, reactor
import os
class Knock(protocol.Protocol):
    def dataReceived(self, data):
        print 'Client:', data
        if data.startswith("Hey, Heroku!"):
            response = "Hi, please wait..."
            self.transport.write(response)
        else:
            response = "I don't know who you are!"
            self.transport.write(response)

class KnockFactory(protocol.Factory):
    def buildProtocol(self, addr):
        return Knock()

reactor.listenTCP(5000, KnockFactory())
reactor.run()

client.py
from twisted.internet import protocol, reactor

class KnockClient(protocol.Protocol):

    def connectionMade(self):
        self.transport.write("Hey, Heroku!")

    def dataReceived(self, data):
        if data.startswith("Hi, please wait..."):
            print ("Heroku:",data)
            self.transport.loseConnection()
            reactor.stop()
    else:
        print ("Heroku:",data)
        self.transport.loseConnection()
        reactor.stop()

class KnockFactory(protocol.ClientFactory):
    protocol = KnockClient

def main():
    f = KnockFactory()
    reactor.connectTCP("0.0.0.0", 5000, f)
    reactor.run()

if __name__ == '__main__':
    main()

我在其他论坛上得到了答案

Only web process types can receive connections, you'll need to setup any servers in the same way that you would with a web server, i.e., binging to 0.0.0.0:$PORT.