这位提问者正在尝试创建一个股票交易游戏的网络前端,该游戏使用 Python 实现,会生成股票价格和随机的文本片段。他计划使用 GWT 作为前端,并希望能够与 Python 共享价格生成器通信,而不是尝试在 Java 中重新编写代码。
他考虑使用 SQLite 数据库,并使用 JDBC 来获取价格,但想知道是否有更好的方法可以在客户端页面或服务器端 Java 代码中轮询某个正在运行的 Python 脚本。他还提到了一个 Python 包装器,但他不确定如何使用它。
2、解决方案
确实存在更好的方法,可以使用名为 Twisted 的 Python 库,实现从 GWT 客户端页面轮询运行中的 Python 脚本。Twisted 是一个事件驱动的网络引擎,可以轻松地创建和管理网络连接,非常适合此类任务。
以下是使用 Twisted 和 GWT 实现此功能的步骤:
- 在 Python 脚本中,使用 Twisted 创建一个服务器。该服务器将监听客户端的连接请求,并在连接建立后发送数据。
- 在 GWT 客户端页面中,使用 JavaScript 库或框架(如 jQuery)来创建轮询请求。该请求将定期向 Python 服务器发送请求,并处理收到的数据。
- 在服务器端,当收到轮询请求后,服务器将使用 Twisted 发送数据给客户端。数据可以是股票价格、文本片段或其他任何需要在客户端显示的信息。
以下是一个代码示例,演示了如何使用 Twisted 和 GWT 来实现此功能:
# Python 脚本
from twisted.internet import reactor, protocol
class SharePriceServer(protocol.Protocol):
def dataReceived(self, data):
# 当收到客户端的请求时,发送数据
self.transport.write("Current share price: 100.00")
class SharePriceFactory(protocol.ServerFactory):
def buildProtocol(self, addr):
return SharePriceServer()
if __name__ == '__main__':
# 创建服务器并开始监听
reactor.listenTCP(8080, SharePriceFactory())
# 运行事件循环
reactor.run()
// GWT 客户端页面
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
public class SharePriceClient {
private static final String SERVER_URL = "http://localhost:8080";
public static void main(String[] args) {
// 每5秒向服务器发送轮询请求
Timer timer = new Timer() {
@Override
public void run() {
// 使用 XMLHttpRequest 发送 GET 请求
XMLHttpRequest xhr = new XMLHttpRequest();
xhr.open("GET", SERVER_URL);
xhr.onload = new EventHandler() {
@Override
public void handleEvent(Event evt) {
// 处理收到的数据
String data = xhr.getResponseText();
Window.alert(data);
}
};
xhr.send();
}
};
timer.scheduleRepeating(5000);
}
}
通过使用 Twisted 和 GWT,能够轻松实现从 GWT 客户端页面轮询运行中的 Python 脚本。Twisted 提供了强大的网络编程功能,而 GWT 则提供了构建跨平台网络应用的强大工具。