Threaded Server Problem

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
silentpolygon
User
Beiträge: 9
Registriert: Montag 14. Mai 2007, 21:49

Freitag 14. März 2008, 22:10

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

EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Freitag 14. März 2008, 22:18

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.
Antworten