python应用程序之间的通信

2024-04-18 16:58:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难为客户机-服务器系统找到一个好的解决方案,在这个系统中,客户机向服务器发出请求,服务器用结果进行响应。服务器需要独立于客户机,也就是说,如果我创建一个新的python应用程序,我希望能够轻松地连接到服务器并发送请求。我知道一个可能的解决方案是使用套接字,但这感觉不必要复杂。我试过找经理,但我不确定是否在正确的轨道上。

我的目标是让一些东西像这样工作:

result = server.send("2+2") # result should now be 4

Tags: 服务器send应用程序目标客户机server系统result
2条回答

一旦我玩过这些东西(在Python中),这里有一个例子(不要介意代码的风格、格式、效率,因为它们都是蹩脚的,编程的PoV中没有很多NO s,只要把它看作是一个起点):

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

我已经用Python2.7.10onWin测试过了。它使用简单的表达式。

签出^{}。它可以像超级电源插座一样点对点地使用,并且在代码中看起来很漂亮和干净,就像您的示例一样。This example显示了它是多么容易。

或者,您可以在服务器端使用像^{}^{}这样的轻量级web服务框架来完成一个简单的REST接口。为了便于使用,它们可以单独运行,然后放在web服务器后面(例如,^{}^{})以提高性能。在客户端,用普通的pythonrequests module与之交谈。

相关问题 更多 >