我想知道是否有人有任何好的资源或建议在Python中为程序添加网络功能,特别是:如果套接字模块最符合我的需求,并且有任何人发现任何资源特别有启发性。< / p>
背景: 我正在尝试创建一个幻想足球应用程序(在Windows中),其中有一个“服务器”程序,用于制作选秀权,以及一个“客户端”程序(在远程计算机上运行,不通过LAN连接),可以连接到服务器并接收选择的更新。基本上,我只需要每分钟左右发送一两个字符串。
我做了一些研究,似乎很多人使用内置套接字模块来完成这样的任务。我不知道这个模块是否适用于此任务是否过度/不足(?),所以任何建议都将受到赞赏。
P.S。 这个程序的GUI将在Tkinter中创建,所以我假设需要为单独的Tk和套接字循环实现一些线程,但这是一个单独的问题,除非你认为它直接影响到这个。
答案 0 :(得分:3)
最简单的解决方案可能是让您的服务器成为一个非常基本的XMLRPC服务器。有一个python类可以做到这一点(SimpleXMLRPCServer)。然后,让您的客户每隔几分钟连接到该服务器以获取更新的数据。
有关详细信息,请参阅http://docs.python.org/library/simplexmlrpcserver.html
这是一个真实的快速而肮脏的例子:
服务器代码
from SimpleXMLRPCServer import SimpleXMLRPCServer
# for demonstration purposes, just return an ever increasing integer
score = 0
def get_scores():
global score
score += 1
return score
# create server, register get_scores function
server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(get_scores, "get_scores")
# start the server
server.serve_forever()
客户端GUI代码
import Tkinter as tk
import xmlrpclib
import socket
class SampleApp(tk.Tk):
# url of the server
url = "http://localhost:8000"
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
# initialize connection to server
self.server = xmlrpclib.ServerProxy(self.url)
# create GUI
self.status = tk.Label(text="", anchor="w")
self.label = tk.Label(text="current score: ?")
self.status.pack(side="bottom", fill="x")
self.label.pack(side="top", fill="both", expand=True)
self.wm_geometry("400x200")
# wait a second to give the GUI a chance to
# display, then start fetching the scores
# every 5 seconds
self.after(1000, self.get_latest_scores, 2000)
def update_status(self, message=""):
'''Update the statusbar with the given message'''
self.status.configure(text=message)
self.update_idletasks()
def get_latest_scores(self, interval):
'''Retrieve latest scores and update the UI'''
try:
self.update_status("connecting...")
score = self.server.get_scores()
self.label.configure(text="current score: %s" % score)
self.update_status()
except socket.error, e:
self.update_status("error: %s" % str(e))
self.after(interval, self.get_latest_scores, interval)
if __name__ == "__main__":
app = SampleApp()
app.mainloop()
答案 1 :(得分:1)
如果您不想使用Twisted,请转到socket。
该链接也有例子。
答案 2 :(得分:0)
Twisted可以让这类事情变得非常简单。但它并不完全是轻量级的。