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

Code: Alles auswählen

 ReceiveNetworkData(ConnectionID, 1000, 1000) 
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 :D

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.
:mrgreen: -> meine Signatur -> mein Avatar :mrgreen:

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??? :mrgreen: