Seite 1 von 1

Netzwerkcode in einem Thread laufen lassen

Verfasst: 28.06.2006 13:20
von smateja
Hallo zusammen - ich quäle mich gerade ein wenig mit Threads herum und dachte mir - es müsste doch eigetnlich möglich sein - Netzwerkanfragen in nem Thread verarbeiten zu lassen - hab auch fleißig (2 mins - sorry) mal rumexperimentiert - nur häng ich mal wieder - evtl. kann mir wer hier unter die Arme greifen:

Code: Alles auswählen

OpenWindow(0001,1,1,800,600,"Server Engine",#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0001))
InitNetwork()
Procedure UpdateServer()
  OpenConsole()
  ConsoleTitle("Console Output")
  CreateNetworkServer(0002, 7070,#PB_Network_TCP)
  UpdateServerEvent = NetworkServerEvent()
  If UpdateServerEvent
    ClientID = EventClient()
    Select UpdateServerEvent
    Case 1
      PrintN("PureBasic - Server"+ "A new client has connected !")
    Case 2
      PrintN("PureBasic - Server"+ "Client "+Str(ClientID)+" has send a packet !")
      PrintN("Info"+ "String: "+PeekS(Buffer))
    Case 3
      PrintN("PureBasic - Server"+ "Client "+Str(ClientID)+" has send a file via the network !")
    Case 4
      PrintN("PureBasic - Server"+ "Client "+Str(ClientID)+" has closed the connexion...")
    EndSelect
  EndIf
  WindowEvent()
EndProcedure
CreateThread(@UpdateServer(),0)
Repeat
  WaitWindowEvent()
Until Exit=1
Problematik ist hier - dass er die Console nicht Updatet - jemand n lösungsvorschlag etc?

Verfasst: 28.06.2006 13:26
von MVXA
Schiele ich oder sehe ich im Thread keine schleife :? ? Die ist wichtig, da
der Thread sonst nach einem Durchlauf sofort toter Mann spielt.

RE:

Verfasst: 28.06.2006 13:26
von smateja
gut erkannt - allerdings nicht mal einmal macht er das - somit mal einfach die schleife vergessen oki ? - Naja der CLient sagt dann schon dass er den Server gefunden hat und sich verbinden kann - aber ich bekomme absolut 0,0 output an der console ? mhmm ?!

Verfasst: 28.06.2006 13:30
von bobobo
wirf deinen Code mal weg unbd nimm den mitgelieferten NetworkServercode im Example Sources Verzeichnis

den ver"threadest" Du dann mal

und beachte mal die Repeat-Schleife im Server

RE:

Verfasst: 28.06.2006 13:33
von smateja
das ist doch der code aus dem mitgeliefertem beispiel nur anstelle mir n popup zu machen (was anbei auch net geht wenns im thread steht) soller ers mir dank print befehl in die console ausgeben ?! und ob da ne schleife drin ist oder net - spielt das so ne große rolle zum testen - mir persönlich reicht das ja wenns genau einaml durchlaufenwürde ?! - ich checks irgendwie noch net?!

Verfasst: 28.06.2006 13:35
von MVXA
Kann da bo³ nur zustimmen. Serveraufgaben und Paketempfang machen
aber dann in einem extra Thread Sinn, wenn Pakete nicht im selben Thread
verarbeitet werden. Merken!

Edit:
sollte schnell werden. Du brauchst die Schleife, um mehrmals die Ereignisse
abzufragen. Wenn das ganze nur einmal durchläuft, fragst du ja nur einmal
das Ereigniss ab. Dann ist schluss. Wenn der Client danach erst connected,
schaust du ja im Postfach nicht mehr nach, ob da was neues drine ist.

Postfach - Ereignissschleife
Ereigniss - Events

Verfasst: 28.06.2006 13:44
von bobobo
der networkserver von PB als Konsole und gethreadet und mit wenig resourcenVerbrauch dank ThreadPriority() und Delay()

Code: Alles auswählen

Global ClientID.l

Procedure server()
Port = 6832
Buffer = AllocateMemory(1000)
If CreateNetworkServer(0, Port)
  PrintN("PureBasic - Server "+ "Server created (Port "+Str(Port)+").")

  Repeat
    SEvent = NetworkServerEvent()
    If SEvent
      ClientID = EventClient()
      Select SEvent
      Case 1
        PrintN("PureBasic - Server "+ "A new client has connected !")
      Case 2
        PrintN("PureBasic - Server "+ "Client "+Str(ClientID)+" has send a packet !")
        ReceiveNetworkData(ClientID, Buffer, 1000)
        PrintN("Info" +"String: "+PeekS(Buffer))
      Case 3
        PrintN("PureBasic - Server "+ "Client "+Str(ClientID)+" has send a file via the network !")
        ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3")
      Case 4
        PrintN("PureBasic - Server "+ "Client "+Str(ClientID)+" has closed the connexion...")
        Quit = 1
      EndSelect
    EndIf
    Delay(5) ; Systemresourccen runter
  Until Quit = 1
  PrintN("PureBasic - Server "+ "closeWindow to quit the server.")
  CloseNetworkServer(0)
Else
  PrintN("Error "+ "Can't create the server (port in use ?).")
EndIf
EndProcedure

OpenConsole()
If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf
tid=CreateThread(@server(),0)
PrintN("Prio von "+Str( ThreadPriority(tid,1))+" auf 1") ; Systemresourccen runter
Input()
CloseConsole()
End

re:

Verfasst: 28.06.2006 13:44
von smateja
okay - klingt eigentlich nur logisch - gleich mal checken *G

Nachtrag: Baut man die Schleife ein - schon rocked das Teil *G lol
Meric an alle die sich da haben rumquälen müssen mit mir :)

Verfasst: 28.06.2006 13:45
von bobobo
nimm das da oben