Seite 1 von 3
console-chat
Verfasst: 12.12.2004 13:18
von captain third
hier ich hab mal versucht einen chat zu machen in einer console,das senden auf den entsprechenden server funktioniert zwar,aber wie kann man eine nachricht erhalten beim client vom server aus?
Code: Alles auswählen
OpenConsole()
ConsoleTitle ("Chatversuch in console")
ConsoleLocate (13,12)
Print ("Please enter your name: ")
name$=Input()
ClearConsole()
Print ("Chatversuch in console")
InitNetwork()
ConnectionID = OpenNetworkConnection("ip", port)
If ConnectionID=0
PrintN ("Verbindung wurde nicht hergestellt ")
Else
PrintN ("Verbindung wurde hergestellt ")
EndIf
PrintN ("Nachricht ")
message:
nachricht$=Input()
SendNetworkString(ConnectionID, nachricht$ )
Gosub message
return
CloseConsole()
End
habt ihr eine idee oder hab ich was vergessen?[/code]
Verfasst: 12.12.2004 15:03
von MVXA
Wenn ich dich richtig verstanden habe, dann hast du dir nicht grade das Handbuch durch gelesen.
gutes altes klugscheißer Handbuch hat geschrieben:Syntax
Ergebnis = SendNetworkData(ConnectionID, *SpeicherBuffer, Länge)
Beschreibung
Sendet Roh-Daten zum angegebenen Client. Dieser Befehl kann von beiden, Client- und Server-Applikationen, genutzt werden.
Auf der Server-Seite ist 'ConnectionID' der Client, welcher die Daten empfangen soll. Auf der Client-Seite benutzen Sie die von OpenNetworkConnection() zurückgegebene 'ConnectionID'.
Das 'Ergebnis' ist die Anzahl an Bytes, die gerade gesendet wurden. Stimmt dies nicht mit dem Parameter 'Länge' überein, dann ist möglicherweise der Empfangsbuffer des Anwenders voll. Wenn nichts gesendet werden konnte, dann erhalten Sie -1 als 'Ergebnis'.
Das funktioniert für Clients
und Server.
Wenn ich dir noch ein Tipp geben darf, sende Strings nicht ohne Struktur zwischen Client und Server. Versuch eine Packetstruktur aufzubauen. Damit kannst du dann mehr ereichen.
Verfasst: 12.12.2004 15:06
von Deeem2031
In deinem Proggy ist ein Fehler, es dürfte nämlich abstürzen sobald du genug Nachrichten geschrieben hast um einen Stackoverflow zu verursachen. Und zwar liegt das Prob dort:
Code: Alles auswählen
message:
nachricht$=Input()
SendNetworkString(ConnectionID, nachricht$ )
Gosub message
return
Du kannst nicht in einem Gosub-Return Bereich denselben ohne Abfrage wieder aufrufen, bei jedem aufruf wird nämlich etwas in den Stack geschrieben und zwar so lange bis er voll ist.
Besser ist:
Code: Alles auswählen
Repeat
nachricht$=Input()
SendNetworkString(ConnectionID, nachricht$ )
Forever
Nu zu deinem eigentlich Prob:
Guck dir mal NetworkClientEvent() an. Allerdings ist das nicht einfach in deinen Code einzufügen da das Input() deinen Code anhält und du wenn du es drin lässt nur Nachrichten empfangen würdest wenn du selber was geschickt hast. Musste also auch zu Inkey() ändern...
Verfasst: 12.12.2004 15:18
von captain third
oi...danke erstma für die antworten...den fehler wegn gosub hab ich natürlich gleich korro gmacht...jetzt aber nochmal wegn mein problem....
müsste der code da rein? also in den clienten? und wenn ja ich wüsste net wo...
sorry wenn ich solche noobfragen stelle,ich progge erst seit ein paar tagen mit pb,normalerweiße progge ich immer mit BB3D oder BB,wollt ma was neues ausprobieren

Verfasst: 12.12.2004 15:51
von MVXA
ne, ist so leider nicht ganz richtig.
Code: Alles auswählen
*TCPBuffer = AllocateMemory(1025)
ReceiveNetworkData(ConnectionID, *TCPBuffer, 1024)
debug peeks(*TCPBuffer)
das müsste dann bei der Schleife
Code: Alles auswählen
Repeat
nachricht$=Input()
SendNetworkString(ConnectionID, nachricht$ )
Forever
gleich als erstes rein, du willst ja wissen ob was angekommen ist.
Verfasst: 12.12.2004 16:00
von Deeem2031
Meine Posts werden gnadenlos ignoriert..
Egal, so ist es richtig (hoff ich doch mal

)
Code: Alles auswählen
*TCPBuffer = AllocateMemory(1024)
Repeat
NCE = NetworkClientEvent()
If NCE = 2 Or NCE = 5
TCPBufferLength = ReceiveNetworkData(ConnectionID, *TCPBuffer, 1024)
PrintN("Empfangen: "+PeekS(*TCPBuffer,TCPBufferLength))
EndIf
Inkey$ = Inkey()
If Asc(Inkey$) <> 13
nachricht$ + Left(Inkey$,1)
Else
SendNetworkString(ConnectionID, nachricht$)
nachricht$ = ""
EndIf
Delay(10)
ForEver
FreeMemory(*TCPBuffer)
Verfasst: 12.12.2004 16:02
von MVXA
Fast, warum willst du den Buffer jedes mal neu erstellen ?
Verfasst: 12.12.2004 16:07
von Deeem2031
nagut... jetzt aber

Verfasst: 12.12.2004 16:09
von Laurin
LittleFurz hat geschrieben:Wenn ich dich richtig verstanden habe, dann hast du dir nicht grade das Handbuch durch gelesen.

-> meine Signatur -> mein Avatar
Code: Alles auswählen
*TCPBuffer = AllocateMemory(1024)
Repeat
NCE = NetworkClientEvent()
If NCE = 2 Or NCE = 5
TCPBufferLength = ReceiveNetworkData(ConnectionID, *TCPBuffer, 1024)
PrintN("Empfangen: "+PeekS(*TCPBuffer,TCPBufferLength))
EndIf
Inkey$ = Inkey()
If Asc(Inkey$) <> 13
nachricht$ + Left(Inkey$,1)
Else
SendNetworkString(ConnectionID, nachricht$)
nachricht$ = ""
EndIf
Delay(10)
ForEver ; <- das solltest du ändern, wegen dem FreeMemory()
FreeMemory(*TCPBuffer)
So ist's ok.
Greetz Laurin
Verfasst: 12.12.2004 16:27
von captain third
so jetzt richtig?
Code: Alles auswählen
OpenConsole()
ConsoleTitle ("Client")
*TCPBuffer = AllocateMemory(1025)
ConsoleLocate (13,12)
Print ("Please enter your name: ")
name$=Input()
ClearConsole()
Print ("Chatversuch in console")
InitNetwork()
ConnectionID = OpenNetworkConnection("ip", port)
If ConnectionID=0
PrintN ("Verbindung wurde nicht hergestellt ")
Else
PrintN ("Verbindung wurde hergestellt ")
EndIf
Repeat
PrintN ("")
nachricht$=Input()
nachrichtx$ = name$ +" : "+ nachricht$
SendNetworkString(ConnectionID, nachrichtx$ )
ReceiveNetworkData(ConnectionID, *TCPBuffer, 1024)
Debug PeekS(*TCPBuffer)
ForEver
CloseConsole()
End
funzt zwar bei mir net...aber jetzt hab ich auch keinen überblick mehr....könnt ihrs bitte für ganz bekloppte erklärn???
