如何在Python中创建简单的网络连接?

4
我想知道是否有任何好的资源或建议,可以在Python程序中添加网络功能,特别是:如果套接字模块最适合我的需求,并且是否有任何让人感到特别启发的资源。
背景: 我正在尝试创建一个幻想足球应用程序(在Windows中),其中有一个“服务器”程序进行选秀,并且一个“客户端”程序(在远程计算机上运行,而不是通过局域网连接)可以连接到服务器并接收选秀的更新。基本上,每分钟我只需要传输一个或两个字符串。
我已经做了一些研究,似乎许多人使用内置的套接字模块来完成诸如此类的任务。我不知道这个模块是否过度/不足以完成这个任务,因此欢迎任何建议。
附言: 这个程序的GUI将在Tkinter中创建,因此我假设需要实现一些线程来处理单独的Tk和套接字循环,但除非您认为它直接影响此问题,否则这是一个单独的问题。
3个回答

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

套接字模块有什么优势,还是仅仅是个人喜好的问题? - Ross B.
1
@Ross B:xmlpc使用套接字来完成其工作。如果您直接使用套接字模块,您可能需要做更多的工作。 - Bryan Oakley

1

如果您不想使用Twisted,那么可以选择socket

该链接还提供了示例。


0

Twisted可以让这种事情变得非常容易。但它并不是特别轻量级的。


1
如果可能的话,我想避免使用Twisted,因为它似乎有一个陡峭的学习曲线,并且可能对此来说过于复杂了。 - Ross B.
@Ross: 我不怪你。这很像企业级应用。 - nmichaels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接