我无法为客户端服务器系统找到一个好的解决方案,客户端向服务器发出请求,服务器会响应结果。服务器需要独立于客户端,即如果我创建一个新的python应用程序,我希望能够轻松连接到服务器并发送请求。我所知道的一个可能的解决方案是使用套接字,但感觉不必要复杂。我尝试过使用经理,但我不确定它是否在正确的轨道上。
我的目标是有这样的工作:
result = server.send("2+2") # result should now be 4
答案 0 :(得分:0)
结帐ZeroMQ
。它可以像超级电源插座一样点对点使用,在您的代码中看起来很干净,就像您的示例一样。 This example显示它有多容易。
或者您可以在服务器端使用轻量级Web服务框架(如Bottle
或Flask
来执行简单的REST
界面。这些可以首先单独运行以便于使用,然后稍后将它们放在Web服务器(例如nginx
和uwsgi
)之后以获得性能。在客户端使用常规python requests module与它交谈。
答案 1 :(得分:0)
一旦我玩了这些东西(在Python中),这是一个例子(不介意代码风格,格式,效率,因为它们是蹩脚的,编程的PoV中有很多NO-NO,只需看一下它就像它一样是一个起点):
server.py:
import sys
import select
from SocketServer import TCPServer, StreamRequestHandler
HOST = "127.0.0.1"
PORT = 12345
class DummyRequestHandler(StreamRequestHandler):
def handle(self):
text = ""
while 1:
if select.select([self.rfile], [], [], 0.5)[0] == [self.rfile]:
char = self.rfile.read(1)
if char == ";":
break
else:
text += char
try:
result = eval(text)
except Exception as e:
result = str(e)
self.wfile.write(str(result) + ";")
print "Listening on %s:%d" % (HOST, PORT)
server = TCPServer((HOST, PORT), DummyRequestHandler)
server.serve_forever()
client.py:
import sys
import socket
import select
HOST = "127.0.0.1"
PORT = 12345
EXIT_TEXT = "EXIT"
text = ""
while not text:
text = raw_input("Enter text to send (%s to exit) :" % EXIT_TEXT)
if text.upper() == EXIT_TEXT:
print "Exiting"
sys.exit(0)
if text[-1] != ";":
text += ";"
s4 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s4.connect((HOST, PORT))
s4.send(text)
reply = ""
while 1:
if select.select([s4], [], [], 0.5)[0] == [s4]:
char = s4.recv(1)
if char == ";":
break
else:
reply += char
print "Server replied: %s\n" % reply
s4.close()
我在 Win 上使用 Python2.7.10 测试了它。它适用于简单的表达式。