2011-08-01 149 views
4

我想知道是否有人在Python中爲程序添加網絡功能方面有什麼好的資源或建議,特別是:如果套接字模塊最適合我的需求,並且任何人都發現任何資源特別有啓發性。如何在Python中創建簡單的網絡連接?

背景: 我試圖創造一個有一個「服務器」程序,使得選秀權一個夢幻足球應用程序(在Windows)和「客戶端」程序(在遠程計算機上運行,​​而不是通過連接局域網),可以連接到服務器並接收更新。基本上,我只需要每分鐘發送一兩個字符串。

我已經做了一些研究,似乎很多人使用內置的套接字模塊來完成這樣的任務。我不知道這個模塊是否是針對這個任務的矯枉過正/不足之處(?),所以任何建議,將不勝感激。

P.S. 這個程序的GUI將在Tkinter中創建,所以我假設需要爲單獨的Tk和套接字循環實現一些線程,但除非您相信它直接影響到這個,否則這是一個單獨的問題。

回答

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

與套接字模塊相比是否有優勢,還是偏好問題? –

+1

@Ross B:xmlpc使用套接字來完成它的工作。如果直接使用套接字模塊,則可能需要做更多的工作。 –

0

Twisted可以使這種事情很容易。雖然它不是很輕巧。

+1

如果可能,我想避免扭曲,因爲它似乎有一個陡峭的學習曲線,可能是這個矯枉過正。 –

+0

@羅斯:我不怪你。這非常企業化。 – nmichaels

1

如果你不想使用扭曲,然後去socket

該鏈接也有示例。

相關問題