console-chat

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
captain third
Beiträge: 194
Registriert: 12.12.2004 13:14
Kontaktdaten:

console-chat

Beitrag 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]
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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.
Bild
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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...
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
captain third
Beiträge: 194
Registriert: 12.12.2004 13:14
Kontaktdaten:

Beitrag 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
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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.
Bild
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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)
Zuletzt geändert von Deeem2031 am 12.12.2004 16:06, insgesamt 2-mal geändert.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Fast, warum willst du den Buffer jedes mal neu erstellen ?
Bild
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

nagut... jetzt aber ;)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag 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
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
captain third
Beiträge: 194
Registriert: 12.12.2004 13:14
Kontaktdaten:

Beitrag 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:
Antworten