2 Fragen bezüglich EventClient()

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag von helpy »

Genau!

Hier der Code für den Server:

Code: Alles auswählen

EnableExplicit
;{ Konstanten
Enumeration
  #Gadget_Text
  #Gadget_ClientList
EndEnumeration

#BufferSize = 1000
#ServerPort = 6832
;}
;{ Variablen
Define *Buffer
Define hMainWindow.i
Define hServer.i, ClientID.i, ReceivedBytes.i, ReceivedMessage.s
Define WEvent.i, SEvent.i
Define GadgetItem.i, iGadgetItem.i
Define Quit.i
;}

*Buffer = AllocateMemory( #BufferSize )
If *Buffer = #Null
  MessageRequester("Error", "Empfangspuffer für Netznachrichten konnte nicht erstellt werden", 0)
  End
EndIf

If InitNetwork() = #Null
  MessageRequester("Error", "Netzwerk konnte nicht initialisiert werden!", 0)
  End
EndIf

hMainWindow = OpenWindow( #PB_Any, 0, 0, 300, 320, "Server", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered )
If hMainWindow = #Null
  MessageRequester("Error", "Fenster konnte nicht geöffnet werden!", 0)
  End
EndIf

TextGadget( #Gadget_Text, 10, 12, 110, 20, "Client Liste:")
ListViewGadget( #Gadget_ClientList, 10, 30, 280, 280 )

hServer = CreateNetworkServer( #PB_Any, #ServerPort )
If hServer
  Repeat
    WEvent = WindowEvent()
    SEvent = NetworkServerEvent()
 
    If SEvent
   
      ClientID = EventClient()
 
      Select SEvent
      
        Case #PB_NetworkEvent_Connect
          AddGadgetItem( 1, #PB_Any, "Client " + Str( ClientID ) )
          GadgetItem = CountGadgetItems( #Gadget_ClientList ) - 1
          SetGadgetItemData( #Gadget_ClientList, GadgetItem, ClientID )
        
        Case #PB_NetworkEvent_Data
          ReceivedBytes = ReceiveNetworkData( ClientID, *Buffer, #BufferSize)
          If ReceivedBytes > 0
            CompilerIf #PB_Compiler_Unicode
              ReceivedMessage = PeekS( *Buffer, ReceivedBytes, #PB_UTF8 )
            CompilerElse
              ReceivedMessage = PeekS( *Buffer, ReceivedBytes, #PB_Ascii )
            CompilerEndIf

            If CountGadgetItems( #Gadget_ClientList ) > 0
              GadgetItem = -1
              For iGadgetItem = 0 To CountGadgetItems( #Gadget_ClientList )
                If GetGadgetItemData( #Gadget_ClientList, iGadgetItem ) = ClientID
                  GadgetItem = iGadgetItem
                  Break
                EndIf
              Next iGadgetItem
              
              If GadgetItem <> -1
                SetGadgetItemText( #Gadget_ClientList, GadgetItem, "Client " + Str( ClientID ) + ": " + ReceivedMessage )
              EndIf
            EndIf
          EndIf
 
        Case #PB_NetworkEvent_File
        
        Case #PB_NetworkEvent_Disconnect
          If CountGadgetItems( #Gadget_ClientList ) > 0
            GadgetItem = -1
            For iGadgetItem = 0 To CountGadgetItems( #Gadget_ClientList )
              If GetGadgetItemData( #Gadget_ClientList, iGadgetItem ) = ClientID
                GadgetItem = iGadgetItem
                Break
              EndIf
            Next iGadgetItem
            
            If GadgetItem <> -1
              RemoveGadgetItem( #Gadget_ClientList, GadgetItem )
            EndIf
          EndIf
         
      EndSelect
    EndIf

    If Not (WEvent Or SEvent) : Delay(50) : EndIf

    If WEvent = #PB_Event_CloseWindow
      Quit = #True
    EndIf

  Until Quit = #True

Else
  MessageRequester("Error", "Server konnte nicht erstellt werden.", 0)
EndIf

End
Und hier noch mein Client-Testcode:

Code: Alles auswählen

#ClientName = "Max Mustermann"

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

Port = 6832

ConnectionID = OpenNetworkConnection("127.0.0.1", Port)

If ConnectionID
  MessageRequester("Client", "Client " + #ClientName + " ist zum Server verbunden. Im nächsten Schritt wird eine Meldung geschickt!", 0)
  SendNetworkString(ConnectionID, #ClientName)
   
  MessageRequester( "Client", "Client " + #ClientName + " nun wieder vom Server trennen!", 0 )

  CloseNetworkConnection(ConnectionID)

Else
  MessageRequester("Client", "Server konnte nicht gefunden werden", 0)
EndIf
 
End
==> Das Suchen des richtigen GadgetItems kann in eine eigene Procedure ausgelagert werden, dann muss der Code nicht zweimal verwendet werden ... aber das überlasse ich Dir ;-)

Noch ein paar ANMERKUNGEN zum Empfangen von Daten mit ReceiveNetworkData:

1. Kommen z.B. zwei Nachrichten von einem Client beim Server an bevor ReceiveNetworkData aufgerufen wurde ... werden in der Folge beide Nachrichten im Empfangspuffer direkt hintereinander ohne irgendein Trennzeichen gespeichert. Wenn Du die Nachrichten also getrennt auswerten willst, musst Du bereits beim Senden die Datenlänge mitschicken, ansosnten weiß der Server nicht, wie lang die einzelnen Nachrichten sind.

2. Sei Dir bewusst, dass SendNetworkString den String OHNE das abschließende NULL-Zeichen verschickt. Das kannst Du in diesem Falls beim Server also nicht zur Auswertung verwenden!

3. Ist der Empfangspuffer zu klein, dann musst Du das auch entsprechend in Deinem Programm behandeln. In diesem Fall ist der Wert von ReceivedBytes = #BufferSize.

Das sind weitere Herausforderungen für Dich als Programmierer ;-)

cu, guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Anxifer
Beiträge: 5
Registriert: 16.06.2009 22:59

Beitrag von Anxifer »

Ich danke dir vielmals für deine Hilfe und mit den Befehlen CountGadgetItems(), GetGadgetItemData() und alles was so zu dem Bereich gehört, werd ich mich mal etwas näher beschäftigen, ich versteh zwar, was die Befehle machen aber im Zusammenhang mit anderen Befehlen is das alles doch ziemlich kompliziert, dafür scheint mein Gehirn nich ausgelegt zu sein. Das heißt also mal wieder Ausprobieren.
Antworten