2012-01-29 4 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() 

Serverクラス

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を使用するように切り替える必要があります。 Twistedは積極的にメンテナンスされ、文書化され、より多くの機能を提供し、無関係なネットワークの低レベルの詳細を抽象化します。

開始するには、serverclient howtosを参照してください。

関連する問題