2012-01-29 71 views
0

我一直在試圖做一個簡單的服務器,我和我的朋友將能夠玩遊戲像去魚或另一個簡單的紙牌遊戲。我只是在學習如何使用asyncore類,我遇到了問題。當沒有服務器時,程序不會連接,但是當它連接成功時,它永遠不會調用handle_accept方法,如果我甚至擺脫了handle_accept方法,它仍然會連接,或者至少不會運行進入任何錯誤。
我一直在使用這個網站和python asyncore方法的描述,但我不明白我做錯了什麼。
http://parijatmishra.wordpress.com/2008/01/04/writing-a-server-with-pythons-asyncore-module/異步服務器Python沒有調用handle_accept或任何其他句柄方法

我已經包含了兩個UI和服務器和客戶端代碼的代碼。

服務器UI

from Tkinter import * 
from Server import * 
import asyncore 

class UI: 

    # initialize UI 
    def __init__(self, master): 

     # create frame1 
     frame1 = Frame(master, width=200, height=50) 
     frame1.pack() 

     # create frame2 
     frame2 = Frame(master, width=200, height=50) 
     frame2.pack() 

     # create start button 
     self.start = Button(frame1, text='Start Server', command=lambda: self.start_server()) 
     self.start.pack() 

     # create end button 
     self.stop = Button(frame1, text='Stop Server', command=lambda: self.stop_server()) 
     self.stop.pack() 

     # create label 
     self.label = Label(frame2) 
     self.label.pack() 

     # keep set size 
     frame1.pack_propagate(0) 
     frame2.pack_propagate(0) 

    def start_server(self): 

     try: 
      self.server = Server() 
      asyncore.loop() 
     except: 
      self.label.config(text='Error. A server is already running.') 
     else: 
      self.label.config(text='Server successfully started') 

    def stop_server(self): 

     try: 
      self.server.stop() 
     except: 
      self.label.config(text='Error. No server is running.') 
     else: 
      self.label.config(text='Server successfully stopped.')  

root = Tk() 
ui = UI(root) 
root.mainloop() 

客戶端UI

from Tkinter import * 
from Client import * 
import asyncore 

class UI: 

    # initialize the UI 
    def __init__(self, master): 

     # create frame1 
     frame1 = Frame(master) 
     frame1.pack() 

     # create frame2 
     frame2 = Frame(master, width=200, height=50) 
     frame2.pack() 

     # create frame3 
     frame3 = Frame(master, width=200, height=50) 
     frame3.pack() 

     # create connect button 
     self.connect = Button(frame1, text='Connect', command=lambda: self.connect_to_server()) 
     self.connect.pack(side=RIGHT) 

     # create disconnect button 
     self.disconnect = Button(frame1, text='Disconnect', command=lambda: self.disconnect_from_server()) 
     self.disconnect.pack() 

     # create label 
     self.label = Label(frame2, text='Enter host\'s ip') 
     self.label.pack() 

     # create entry box 
     self.entry = Entry(frame3) 
     self.entry.pack() 

     # keep set size 
     frame2.pack_propagate(0) 
     frame3.pack_propagate(0) 

    # connect to a server  
    def connect_to_server(self): 

     ip = self.entry.get() 

     try: 
      self.client = Client(ip) 
      asyncore.loop() 
     except: 
      self.label.config(text='Error. Unable to connect.') 
     else: 
      self.label.config(text='Successfully connected.') 

    # disconnect from a server  
    def disconnect_from_server(self): 
     try: 
      self.client.disconnect() 
     except: 
      self.label.config(text='Error. Not connected to anything.') 
     else: 
      self.label.config(text='Successfully disconnected.') 


root = Tk() 
ui = UI(root) 
root.mainloop() 

服務器類

from socket import * 
import asyncore 

class Server(asyncore.dispatcher): 

    # initialize a server 
    def __init__(self): 

     asyncore.dispatcher.__init__(self) 
     self.host = '127.0.0.1' 
     self.port = 50000 
     self.size = 1024 
     self.s = socket(AF_INET, SOCK_STREAM) 
     self.s.bind((self.host,self.port)) 
     self.s.listen(5) 


    def stop(self): 

     self.s.close() 

    def readable(self): 
     return True 

    def handle_accept(self): 
     client, addr = self.s.accept() 
     print 'Incoming connection from ', repr(addr) 

Client類

from socket import * 
import asyncore 

class Client(asyncore.dispatcher): 

    def __init__(self, ip): 

     asyncore.dispatcher.__init__(self) 
     self.address = ip 
     self.port = 50000 
     self.size = 1024 
     self.s = socket(AF_INET, SOCK_STREAM) 
     self.s.connect((self.address, self.port)) 

    def disconnect(self): 

     self.s.close() 

    def send_data(self, msg): 

     self.s.send(msg) 

    def handle_connect(self): 
     print 'Trying to connect' 

回答

1

handle_connect被調用是否連接嘗試成功或失敗。它被稱爲通知你,連接嘗試是完成,而不是它已經成功。你必須檢查以確定它是否成功。

而不是解決asyncore的各種奧祕,你應該切換到使用Twisted代替。扭曲是積極維護,更好的文檔記錄,提供更多的功能,並從您身上提取更多不相關的低層次網絡細節。

查看serverclient howtos上手。

相關問題