Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] correr un MainLoop() y serve_forever()

Estas en el tema de correr un MainLoop() y serve_forever() en el foro de Python en Foros del Web. tengo el siguiente problema con mi codigo pasa que cuando ejecuto la aplicacion servidor abre el frame pero cuando corro el cliente y envio algo ...
  #1 (permalink)  
Antiguo 14/04/2013, 13:56
Avatar de counsantor2d  
Fecha de Ingreso: junio-2012
Ubicación: Maracaibo
Mensajes: 12
Antigüedad: 12 años, 5 meses
Puntos: 1
Pregunta correr un MainLoop() y serve_forever()

tengo el siguiente problema con mi codigo pasa que cuando ejecuto la aplicacion servidor abre el frame pero cuando corro el cliente y envio algo para conectarse con el server este se pega creo que algo anda mal que puedo hacer ?

Mi codigo:

Código Python:
Ver original
  1. import SocketServer, wx
  2.  
  3. class MyTCPHandler(SocketServer.BaseRequestHandler, wx.Frame):
  4.             def __init__(self):
  5.                     parent, id, title = None, -1, 'jespy'
  6.                     wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(250, 50))
  7.                     self.panel_1 = wx.Panel(self, wx.ID_ANY)
  8.                     self.panel_1.SetMinSize((320, 220))
  9.                     self.textochat = wx.TextCtrl(self, wx.ID_ANY, style = wx.TE_MULTILINE| wx.TE_READONLY)
  10.                     self.textochat.SetMinSize((320, 220))
  11.                     toolbar = self.CreateToolBar()
  12.                     self.power = toolbar.AddLabelTool(wx.ID_ANY, 'Quit', wx.Bitmap('power.png'))
  13.                     self.refresh = toolbar.AddLabelTool(wx.ID_ANY, 'Refresh', wx.Bitmap('refresh.png'))
  14.                     toolbar.Realize()
  15.                     self.text_ctrl_1 = wx.TextCtrl(self, wx.ID_ANY, "")
  16.                     self.text_ctrl_1.SetMinSize((320, 40))
  17.                     self.botones = wx.Button(self, wx.ID_ANY, ("Enviar"))
  18.                     self.panel_1.SetBackgroundColour(wx.Colour(255,255,255))
  19.                     self.textochat.SetBackgroundColour(wx.Colour(255,255,255))
  20.                     sizer_1 = wx.BoxSizer(wx.VERTICAL)
  21.                     sizer_2 = wx.BoxSizer(wx.VERTICAL)
  22.                     sizer_3 = wx.BoxSizer(wx.VERTICAL)
  23.                     sizer_2.Add(self.textochat, 0, wx.EXPAND, 0)
  24.                     sizer_2.Add(sizer_3, 1, wx.EXPAND, 0)
  25.                     sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
  26.                     self.SetSizer(sizer_1)
  27.                     sizer_1.Fit(self)
  28.      
  29.             def handle(self):
  30.                     self.data = self.request.recv(1024).strip()
  31.                     self.request.sendall(self.data.upper())
  32.                     print self.data
  33.      
  34.      
  35.     try:
  36.             HOST, PORT = "localhost", 6063
  37.             server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
  38.             ip = server.server_address
  39.             print ip
  40.             class appjes(wx.App):
  41.                     def OnInit(self):
  42.                             frame = MyTCPHandler()
  43.                             frame.SetBackgroundColour(wx.Colour(71,159,221))
  44.                             frame.Show(True)
  45.                             frame.Centre()
  46.                             return True
  47.             app = appjes(0)
  48.             app.MainLoop()
  49.             server.serve_forever()
  50.     except SocketServer.error as e:
  51.             print "el cliente se desconecto"
  #2 (permalink)  
Antiguo 14/04/2013, 14:00
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 10 meses
Puntos: 35
Respuesta: correr un MainLoop() y serve_forever()

Puedes ejecutar tu main loop en otro hilo:

Código Python:
Ver original
  1. from threading import Thread
  2.  
  3. t = Thread(target=MainLoop)
  4. t.start()
  5.  
  6. server.serve_forever()

  #3 (permalink)  
Antiguo 14/04/2013, 14:19
Avatar de counsantor2d  
Fecha de Ingreso: junio-2012
Ubicación: Maracaibo
Mensajes: 12
Antigüedad: 12 años, 5 meses
Puntos: 1
Pregunta Respuesta: correr un MainLoop() y serve_forever()

Cita:
Iniciado por carbon Ver Mensaje
Puedes ejecutar tu main loop en otro hilo:

Código Python:
Ver original
  1. from threading import Thread
  2.  
  3. t = Thread(target=MainLoop)
  4. t.start()
  5.  
  6. server.serve_forever()

no entiendo sobre los thread lo coloque asi

pero no anda :/

Código Python:
Ver original
  1. try:
  2.     HOST, PORT = "localhost", 6063
  3.     server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
  4.     ip = server.server_address
  5.     print ip
  6.     class appjes(wx.App):
  7.         def OnInit(self):
  8.             frame = MyTCPHandler()
  9.             frame.SetBackgroundColour(wx.Colour(71,159,221))
  10.             frame.Show(True)
  11.             frame.Centre()
  12.             return True
  13.     app = appjes(0)
  14.     t = Thread(target= app.MainLoop)
  15.     t.start()
  16.     server.serve_forever()
  17. except SocketServer.error as e:
  18.     print "el cliente se desconecto"
  #4 (permalink)  
Antiguo 14/04/2013, 14:22
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 10 meses
Puntos: 35
Respuesta: correr un MainLoop() y serve_forever()

La idea del thread es que puedas correr el loop de wxPython por un lado y el de socket por otro, paralelamente.

Que error te tira?
  #5 (permalink)  
Antiguo 14/04/2013, 14:27
Avatar de counsantor2d  
Fecha de Ingreso: junio-2012
Ubicación: Maracaibo
Mensajes: 12
Antigüedad: 12 años, 5 meses
Puntos: 1
Respuesta: correr un MainLoop() y serve_forever()

Cita:
Iniciado por carbon Ver Mensaje
La idea del thread es que puedas correr el loop de wxPython por un lado y el de socket por otro, paralelamente.

Que error te tira?
ninguno el frame abre pero se cuelga se queda paralizado...
  #6 (permalink)  
Antiguo 14/04/2013, 14:28
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: correr un MainLoop() y serve_forever()

http://wiki.wxpython.org/AsynchronousSockets

Ya hay ejemplos hechos para eso.

Para probarlo corre el código de ejemplo.

Y después en otra terminal corre netcat.

Código:
nc localhost 1199
Empieza a escribir y luego presiona enter.

Última edición por razpeitia; 14/04/2013 a las 14:35

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:05.