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

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