Seite 1 von 1

Threaded Server Problem

Verfasst: Freitag 14. März 2008, 22:10
von silentpolygon
Hallo

Ich habe gerade angefangen mich mit dem Thema Multithreading zu beschäftigen und hab mal einen Server angefangen. Eigentlich sollte der ja mithilfe des Threadings nicht mehr nach dem s.accept() Aufruf einfrieren. Er tut es aber doch.

Könnte Hilfe gebrauchen, da ich nach mehreren Stunden herumprobieren echt festhänge.

Danke im vorraus.

Hier der Code

Code: Alles auswählen

import wx, socket, sys, os
from threading import *
 
class TestServer(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Testserver", size=(500, 500))
        
        menuBar = wx.MenuBar()
        ServerMenu = wx.Menu()
        ServerMenu.Append(101, '&Enable', 'Enable Server')
        ServerMenu.Append(102, '&Disable', 'Disable Server')
        menuBar.Append(ServerMenu, '&Server')
        self.SetMenuBar(menuBar)

        self.Bind(wx.EVT_TOOL, self.EnableServer, id=101)
        self.Bind(wx.EVT_TOOL, self.DisableServer, id=102)

        nb = wx.Notebook(self, -1, style=wx.NB_TOP)
        self.usheet = wx.Panel(nb)
        self.prefsheet = wx.Panel(nb)
        nb.AddPage(self.usheet, "Users")
        nb.AddPage(self.prefsheet, "Preferences")
        self.usheet.SetFocus()

        self.log = wx.LogWindow(self, ("Serverlog"), False, False)
        self.log.Show(not self.log.GetFrame().IsShown())

        self.CreateStatusBar()

    def handlechild(self, clientsock):
        wx.LogMessage(currentThread().getName())
        wx.LogMessage(clientsock.getpeername())
        while 1:
            data = clientsock.recv(4096)
            if not len(data):
                break
            clientsock.sendall(data)
        clientsock.close()

    def EnableServer(self, event):
        host = ''
        self.port = 51423

        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.s.bind((host, self.port))
        self.s.listen(1)
        wx.LogMessage('Server is running...')

        while 1:
            clientsock, clientadress = self.s.accept()
            t = Thread(target = self.handlechild, args = [clientsock])
            t.setDaemon(1)
            t.start()

    def DisableServer(self, event):
        self.s.close()
        wx.LogMessage('...Server stopped')

if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = TestServer()
    frame.Show(True)
    frame.Centre()
    app.MainLoop()


Verfasst: Freitag 14. März 2008, 22:18
von EyDu
Ist doch vollkommen klar, dass das Programm hängen bleibt, da nicht der Thread auf die Verbindung wartet, sondern die Methode "EnableServer". Erst nachdem die Verbindung aufgebaut wurde, wird bei dir der Thread gestartet -> In EINEM Thread auf Verbindung warten und ausgehend von diesem eventuell die Verbindugen an andere Threads deligieren.

Dursuch das Forum nochmal nach "Threading" und "GUI", da gibt es nämlich noch so einiges zu beachten.

Und lass doch bitte die *-importe.