【问题标题】:How do I write something that communicates with a twisted server?如何编写与扭曲服务器通信的内容?
【发布时间】:2015-07-27 20:49:52
【问题描述】:

我编写了一个基本的twisted 服务器,它与一个测试客户端(也在twisted 中)一起工作。

这是服务器:

from twisted.internet import protocol, reactor, endpoints
import pickle
from time import sleep

def function(x, y):
    sleep(2)
    return x+y

class Pickle(protocol.Protocol):

    def dataReceived(self, pickled):
        data = pickle.loads(pickled)
        response = function(*data)
        self.transport.write(pickle.dumps(response))
        self.transport.loseConnection()

class PickleFactory(protocol.Factory):

    def buildProtocol(self, addr):
        return Pickle()

endpoint = endpoints.TCP4ServerEndpoint(reactor, 1234)
endpoint.listen(PickleFactory())
reactor.run()

在客户端,我想要类似的东西

def send(x,y):
    '''Calculates function(x,y) on a remote server'''
    pass

向服务器发送请求并阻塞,直到它得到响应。我不想在客户端做任何事件驱动/异步的事情。反应堆无法重启的事实意味着我不能天真地为此使用扭曲。

send 的最佳方式是什么?我可以使用扭曲吗?或者我应该只使用一些低级别的东西,比如 socket 或 telnetlib?

谢谢!

【问题讨论】:

  • 不要在网络连接上使用pickle;它可以执行任意代码。

标签: python sockets tcp twisted


【解决方案1】:

使用socket(可能不是最优雅的):

def send(x, y):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('localhost', 1234))
    s.send(pickle.dumps((x, y))
    result = b''
    while True:
        data = s.recv(1024)
        if len(data) == 0: break
        result += data
    s.close()
    return (pickle.loads(result))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2012-09-27
    • 2011-03-17
    • 1970-01-01
    • 2012-01-09
    • 2018-05-22
    • 1970-01-01
    相关资源
    最近更新 更多