Server <-> Client

Anfängerfragen zum Programmieren mit PureBasic.
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Server <-> Client

Beitrag von cofter »

Hallo an alle. :)

Ich habe mir eine kleine Procedure geschrieben womit der Client Daten vom Server empfangen soll.

Code: Alles auswählen

   Procedure recieve_data()
    *Buffer = AllocateMemory(5000)
    ReceiveNetworkData(connectionID, *Buffer, 5000)
    rData.s = PeekS(*Buffer)
   
    StartDrawing(ScreenOutput())
      FrontColor(RGB(0, 0, 0))
      DrawingMode(1)
      DrawText (0,140,"ServerData: " +rData)
    StopDrawing()
    FreeMemory(*Buffer)
   EndProcedure 
Füge ich nun in die Hauptschleife recieve_data() ein bleibt das Programm hängen und zeigt nur einen schwarzen Screen anstatt die Welt.

Der Server hat eine Procedure die Daten an die Clienten schickt.

Code: Alles auswählen

Procedure Send()
  SendNetworkString(EventClient(), "Lala...server text")
EndProcedure
Im Moment nur ein kleiner Test-String.
Die Procedure Send() wird aufgerufen wenn EventClient() Daten empfängt.

Code: Alles auswählen

If SEvent
    ClientID = EventClient()
    
    Select SEvent    
      Case 1 
        AddGadgetItem(#ConsoleEditorGadged,a,"Neuer Client Connectet! " +Str(ClientID) +Chr(10)+ Chr(13))
        AddGadgetItem(#ListPlayer,0,Str(ClientID))
      Case 2
        ReceiveNetworkData(ClientID, *Buffer, 5000)
        neuText.s = PeekS(*Buffer)
        Send()
      Case 3
        SetGadgetText(#ConsoleStringGadged,"Client " +Str(ClientID)+ " versucht Datei zu schicken!"+ Chr(10))
      Case 4
        ;SetGadgetText(#ConsoleStringGadged,"Client " +Str(ClientID)+ " verlässt den Server"+ Chr(10))
        AddGadgetItem(#ConsoleEditorGadged,a,"Client " +Str(ClientID)+ " verlässt den Server"+ Chr(10))
        RemoveGadgetItem(#ListPLayer, 0)
    EndSelect
  EndIf
Meine Frage nun.
Warum läuft der Client nicht mehr ordnungsgemäß wenn ich recieve_data() in der Hautschleife aufrufe?


mfg
Cofter
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

..und flippbuffers() ? :wink: (oder gibts das in der hauptschleife schon?)
my pb stuff..
Bild..jedenfalls war das mal so.
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag von cofter »

Ja gibts natürlich.
Das Probelm tritt nur auf wenn ich die besagte Procedure benutze und diese in die Hauptschleife einsetze.

mfg
Cofter
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag von cofter »

Sonst niemand eine Idee wie das Problem zustande kommt?
Habe jetzt schon einige Stunden Rumprobiert. :(


Edit:

Habe jetzt noch ein wenig rumprobiert.

Code: Alles auswählen

   Procedure recieve_data()
    *Buffer = AllocateMemory(5000)
    ReceiveNetworkData(connectionID, *Buffer, 5000)
    rData.s = PeekS(*Buffer)
    Delay(1)
    StartDrawing(ScreenOutput())
      FrontColor(RGB(0, 0, 0))
      DrawingMode(1)
      DrawText (0,140,"ServerData: " +rData.s)
    StopDrawing()
    FreeMemory(*Buffer)
   EndProcedure  
Eigentlich ist es im Moment egal wo ich die Procedure aufrufe ( in und ausserhalb der Hauptschleife) in jedem Fall bleibt das Programm hängen.
Hat denn wirklich keiner eine Idee was ich falsch mache?
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag von cofter »

Ich glaube ich habe es gaanz allein herausgefunden. :mrgreen:

Ich habe in die Hauptschleife in IF : EndIf und dorthinein den Aufruf der Procedure gelegt.

Code: Alles auswählen

      If NetworkClientEvent(ConnectionID) = #PB_NetworkEvent_Data
        recieve_data()
      EndIf
Das Programm läuft flüssig und es kommt der Test String an. *freuuu*
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

welche farbe hat dein screen? du schreibst den text nämlich in schwarz.
oder vielleicht zu viele flipbuffers?
<edit: ah, schon gelöst>
my pb stuff..
Bild..jedenfalls war das mal so.
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag von cofter »

Ja das Problem konnte ich lösen.
Aber jetzt scheitere ich wieder am nächsten. :(

Versuche gerade alles auf LinkedLists umzustellen.

Code: Alles auswählen

Procedure recieve_all()
  *Buffer = AllocateMemory(3072) 
  Global SEvent = NetworkServerEvent()
  ExamineIPAddresses()
   

  If SEvent
    Global ClientID = EventClient()
    
    Select SEvent    
      Case 1
      NewList PlayerS.PlayerStruct()
      AddElement(PlayerS())
      Shared PlayerS()\PlayerID = ClientID   
                
        AddGadgetItem(#ConsoleEditorGadged,a,"Neuer Client Connectet! " +Str(PlayerS()\PlayerID) +Chr(10)+ Chr(13))
        AddGadgetItem(#ListPlayer,0,Str(ClientID))                     
      Case 2
        ReceiveNetworkData(ClientID, *Buffer, 3072)
        neuText.s = PeekS(*Buffer)
        ClientID=Val(StringField(neuText.s, 1, ";"))
        pz=Val(StringField(neuText.s, 2, ";"))
        px=Val(StringField(neuText.s, 3, ";"))
        py=Val(StringField(neuText.s, 4, ";"))
        Send(ClientID,pz,px,py)
        
        
      Case 3
        SetGadgetText(#ConsoleStringGadged,"Client " +Str(PlayerS()\PlayerID)+ " versucht Datei zu schicken!"+ Chr(10))
      Case 4
        
        AddGadgetItem(#ConsoleEditorGadged,a,"Client " +Str(PlayerS()\PlayerID)+ " verlässt den Server"+ Chr(10))
        RemoveGadgetItem(#ListPLayer, 0)

    EndSelect
  EndIf
  
FreeMemory(*Buffer)
EndProcedure
Im Case1 funktioniert noch alles.
Bei Case4 kommt eine Fehlermeldung.

Da LinkedLists laut Anleitung immer Lokal sind sollte man Shared verwenden.

Code: Alles auswählen

shared PlayerS()
Trage ich das ein kommt ein Purebasic.asm Fehler. :o
Ist das ein Bug?
Oder kann mir jemand einer andere Methode sagen?

mfg
Cofter
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Brauch man dafür irgenteine bestimmte PB Version?
Also ich hab PB 4.0 nur bei mir Sehen da meerere Fehlermeldungen!

Code: Alles auswählen

Port = 6832

If InitNetwork() = 0
  MessageBox_(Win,"Netzwerk Umgebung kann nicht vorbreitet werden!"+Chr(13)+"Ist dein Computer Internet Tauglich?","Warnung",#MB_OK | #MB_ICONERROR)
  End
EndIf



;-------------Endlosschleife, bis was passiert-----------------------

If CreateNetworkServer(4, Port , #PB_Network_TCP)




Procedure recieve_all() 
  *Buffer = AllocateMemory(3072) 
  Global SEvent = NetworkServerEvent() 
  ExamineIPAddresses() 
    

  If SEvent 
    Global ClientID = EventClient() 
    
    Select SEvent    
      Case 1 
      NewList PlayerS.PlayerStruct() 
      AddElement(PlayerS()) 
      Shared PlayerS()\PlayerID = ClientID    
                
        AddGadgetItem(#ConsoleEditorGadged,a,"Neuer Client Connectet! " +Str(PlayerS()\PlayerID) +Chr(10)+ Chr(13)) 
        AddGadgetItem(#ListPlayer,0,Str(ClientID))                      
      Case 2 
        ReceiveNetworkData(ClientID, *Buffer, 3072) 
        neuText.s = PeekS(*Buffer) 
        ClientID=Val(StringField(neuText.s, 1, ";")) 
        pz=Val(StringField(neuText.s, 2, ";")) 
        px=Val(StringField(neuText.s, 3, ";")) 
        py=Val(StringField(neuText.s, 4, ";")) 
        Send(ClientID,pz,px,py) 
        
        
      Case 3 
        SetGadgetText(#ConsoleStringGadged,"Client " +Str(PlayerS()\PlayerID)+ " versucht Datei zu schicken!"+ Chr(10)) 
      Case 4 
        
        AddGadgetItem(#ConsoleEditorGadged,a,"Client " +Str(PlayerS()\PlayerID)+ " verlässt den Server"+ Chr(10)) 
        RemoveGadgetItem(#ListPLayer, 0) 

    EndSelect 
  EndIf 
  
FreeMemory(*Buffer) 
EndProcedure 
 

Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Fehler: Procedure innerhalb einer IF ... Endif Anweisung, Code nicht Vollständig
:wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

aja ok!
Antworten