Python асинхронного сервера не вызывает handle_accept или любые другие методы дескриптора - PullRequest
0 голосов
/ 29 января 2012

Я пытался создать простой сервер, на котором я и мой друг могли бы играть в такую ​​игру, как ловить рыбу или другую простую карточную игру.Я только учусь пользоваться асинхронным классом, и у меня возникла проблема.Программа не будет подключаться, когда сервер не работает, но когда он есть, он говорит, что он подключен успешно, однако он никогда не вызывает метод handle_accept, и если я даже избавлюсь от метода handle_accept, он все равно подключится или, по крайней мере, не запуститсяв любые ошибки.
Я использую этот сайт и описания асинхронного метода Python, но я не понимаю, что я делаю неправильно.
http://parijatmishra.wordpress.com/2008/01/04/writing-a-server-with-pythons-asyncore-module/

Я включилкод как для пользовательского интерфейса, так и для кода сервера и клиента.

пользовательский интерфейс сервера

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

пользовательский интерфейс клиента

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) 

Клиентский класс

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 Ответ

1 голос
/ 30 января 2012

handle_connect вызывается независимо от того, была ли попытка подключения успешной или неудачной. Он вызывается, чтобы уведомить вас о том, что попытка подключения завершена , а не о том, что она определенно преуспела. Вы должны проверить, чтобы определить, удалось ли это.

Вместо того, чтобы разбираться с различными загадками асинхронности, вы должны вместо этого использовать Twisted. Twisted активно поддерживается, лучше документируется, предоставляет гораздо больше функциональных возможностей и отвлекает от вас ненужные подробности низкоуровневого сетевого взаимодействия.

См. сервер и клиент инструкции по началу работы.

...