Hi,
ich bin neu hier im Board und hab gleich schon ein Problem. Ich habe versucht einen kleinen chat zu schreiben, bei dem ich SendNetworkString verwende. Nun habe ich teilweise den Fall, dass bei dem Client mehrere Datensaetze ankommen, bevor er sie abruft. Dann fasst er sie aber immer in einen zusammen.
Beispiel:
Ich sende nach einander
"Hallo"
"Welt"
"Wie"
"Gehts"
Wenn ich die aber zu schnell hinter einander sende, kommt das beim client als "HalloWeltWieGehts" an.
Wisst ihr was man dagegen machen kann?
Problem mit SendNetworkString und SendNetworkData
- Deluxe0321
- Beiträge: 336
- Registriert: 19.05.2006 00:31
- Kontaktdaten:
Server:
Client:
Ich denke bei näherer Betrachtung des Codes wirst du festellen wie ich das Regele.
Vor jedem Empfang einer "Nachricht" reservire ich mir etwas Speicher, schreibe in diesen den Empfang, gebe ihn aus & lösche dann den Speicherbereich wieder.
Keine Ahnung ob meine Methode richtig ist, aber bei mir hat sie bissher immer prima funktioniert
Gruß Marvin
Edit://WaitWindowEvent => WindowEvent (danke HeXor, hab ich verpeilt)
Code: Alles auswählen
Enumeration
#Listview_0
#String_0
#Button_0
EndEnumeration
Procedure Open_window()
If OpenWindow(0, 256, 211, 315, 279, "Server", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(0))
ListViewGadget(#Listview_0, 0, 0, 315, 250)
StringGadget(#String_0, 0, 255, 235, 20, "")
ButtonGadget(#Button_0, 240, 255, 75, 20, "Senden")
EndIf
EndIf
EndProcedure
InitNetwork()
If ExamineIPAddresses()
IP.l = NextIPAddress()
EndIf
If CreateNetworkServer(0, 6654)
Open_window()
AddGadgetItem(#Listview_0,-1,"Server Online Listening on IP (" + IPString(IP) + ")")
Repeat
Event = WindowEvent()
GadgetID = EventGadget()
If Event = #PB_Event_Gadget
If GadgetID = #Button_0
String$=GetGadgetText(#String_0)
SetGadgetText(#String_0,"")
If ClientID.l
SendNetworkData(ClientID.l, @String$, Len(String$))
Endif
EndIf
EndIf
Select NetworkServerEvent()
Case 0
Delay(1)
Case 1
AddGadgetItem(#Listview_0,-1,"Ein neuer Client hat Connectet")
ClientID.l = EventClient()
Case 2
*buffer = AllocateMemory(2000)
length.l = ReceiveNetworkData(ClientID, *buffer, 2000)
String$ = PeekS(*buffer, 2000)
AddGadgetItem(#Listview_0,-1,"Received:" + String$)
FreeMemory(*buffer)
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
End
Code: Alles auswählen
Enumeration
#Listview_0
#String_0
#Button_0
EndEnumeration
Procedure Open_window()
If OpenWindow(0, 256, 211, 315, 279, "Client", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(0))
ListViewGadget(#Listview_0, 0, 0, 315, 250)
StringGadget(#String_0, 0, 255, 235, 20, "")
ButtonGadget(#Button_0, 240, 255, 75, 20, "Senden")
EndIf
EndIf
EndProcedure
If InitNetwork() = 0
MessageRequester("Error", "Error")
EndIf
ip$ = "127.0.0.1"
ConnectionID = OpenNetworkConnection(ip$, 6654)
If ConnectionID
Open_window()
Repeat
Event = WindowEvent()
GadgetID = EventGadget()
If Event = #PB_Event_Gadget
If GadgetID = #Button_0
String$=GetGadgetText(#String_0)
SetGadgetText(#String_0,"")
SendNetworkData(ConnectionID, @String$, Len(String$))
EndIf
EndIf
Sev=NetworkClientEvent(ConnectionID)
If Sev = #PB_NetworkEvent_Data
*Buffer=AllocateMemory(1000)
ReceiveNetworkData(ConnectionID, *Buffer, 1000)
AddGadgetItem(#Listview_0,-1,PeekS(*Buffer))
FreeMemory(*Buffer)
ElseIf Sev = 0
Delay(1)
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
End
Vor jedem Empfang einer "Nachricht" reservire ich mir etwas Speicher, schreibe in diesen den Empfang, gebe ihn aus & lösche dann den Speicherbereich wieder.
Keine Ahnung ob meine Methode richtig ist, aber bei mir hat sie bissher immer prima funktioniert

Gruß Marvin
Edit://WaitWindowEvent => WindowEvent (danke HeXor, hab ich verpeilt)
Zuletzt geändert von Deluxe0321 am 09.12.2007 18:47, insgesamt 1-mal geändert.
- HeX0R
- Beiträge: 3042
- Registriert: 10.09.2004 09:59
- Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3 - Kontaktdaten:
Ich würde mal beim Überfliegen deines Codes vermuten, dass deine Sende-/Empfangen-Routinen nur funktionieren, wenn du die Maus übers Fenster fährst, was schon mal recht unpraktikabel ist.Deluxe0321 hat geschrieben: Keine Ahnung ob meine Methode richtig ist, aber bei mir hat sie bissher immer prima funktioniert
![]()
Ausserdem solltest du mindestens das Nullbyte des Strings mitschicken, besser noch die Länge, weil dein Server sonst keine Ahnung hat wo ein String anfängt und der andere aufhört.
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
Buffer brauch nicht immer gelöscht werden. Len Von ReceiveNet... auswerten
FF 
Code: Alles auswählen
len = ReceiveNetworkData(ConnectionID, *Buffer, 1000)
text.s = PeekS(*Buffer, len)

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive