Chatprogramm

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Is eigentlich ne API-Function, also gehört nen '_' dahinter :|
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Trottel ich :oops:. Kommt davon, wenn man von der MSDN Seite kopiert >___<.
Bild
Benutzeravatar
AirTokio
Beiträge: 22
Registriert: 13.06.2005 21:12

Beitrag von AirTokio »

Ey ist doch aber total egal! Funktioniert jetzt ;)
Könntet ihr mir jetzt noch mit den verschicken der Naricht an alle verbundenen Clients helfen?
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

mach ne LinkedList und schick dann zu jedem der da eingetragen is ne nachricht.

Ungefähr so:

Code: Alles auswählen

NewList Clients.l()

AddElement Clients.l()
Clients() = clientnummer1

AddElement Clients.l()
Clients() = clientnummer2

;da fügst du halt Clients hinzu
;dann...

ForEach Clients()
  SendNetowrkString(Clients(),undsoweiter)
Next
So sollte das ungefähr funktionieren ;)
Benutzeravatar
AirTokio
Beiträge: 22
Registriert: 13.06.2005 21:12

Beitrag von AirTokio »

Wow klingt ja ganz einfach ;)
Bloss wo in den Quelltext soll ich es reinschreiben, bzw kommt wieder ein Fehler: Clients is not a valid operator ?
Zuletzt geändert von AirTokio am 14.06.2005 21:06, insgesamt 1-mal geändert.
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Irgendwo zwischendrin, zeig doch mal deinen jetzigen Code :)
Benutzeravatar
AirTokio
Beiträge: 22
Registriert: 13.06.2005 21:12

Beitrag von AirTokio »

Jo klar ;)
Kommt aber ein Fehler: "Clients" is not a valid Operator!

Server:

Code: Alles auswählen

OpenConsole()                                             
 
ConsoleTitle("Server")                             
ConsoleColor (15, 0)



If InitNetwork() = 0
  PrintN("Konnte Netzwerk nicht finden !")
  End
EndIf

Port = 6832
Buffer = AllocateMemory(1000)

If CreateNetworkServer(Port)

  PrintN("Server wurder erstellt (Port "+Str(Port)+").")
 
  Repeat
     
    SEvent.l = NetworkServerEvent()
 
    If SEvent
   
      ClientID = NetworkClientID()
 
      Select SEvent
     
        Case 1
          PrintN("Ein neuer Client hat sich angemeldet !")
 
        Case 2 
        RtlZeroMemory_(Buffer, 1000)
        ReceiveNetworkData(NetworkClientID(), Buffer, 1000)
        PrintN(""+ PeekS(Buffer))
             
        
        
        NewList Clients.l()

        AddElement Clients.l()
        Clients() = clientnummer1

        AddElement Clients.l()
        Clients() = clientnummer2

        ForEach Clients()
        SendNetowrkString(Clients(),undsoweiter)
        Next
        
        
        
        
        Case 3
          PrintN("Client "+ Str(ClientID) + " hat die Verbindung beendet...")
   
   
   

   
      EndSelect
    EndIf
   
  Until Quit = 1
 
  PrintN("Klicke zum beenden des Servers.")
  Input()
  CloseNetworkServer()
Else
  PrintN("Konnte Server nicht erstellen (Wird der Port bereits benutzt ?).")
EndIf

 
End
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

So geht das:

Code: Alles auswählen

;###########
NewList Clients.l()
;##############
OpenConsole()                                             

ConsoleTitle("Server")                             
ConsoleColor (15, 0)



If InitNetwork() = 0
  PrintN("Konnte Netzwerk nicht finden !")
  End
EndIf

Port = 6832
Buffer = AllocateMemory(1000)

If CreateNetworkServer(Port)

  PrintN("Server wurder erstellt (Port "+Str(Port)+").")
 
  Repeat
     
    SEvent.l = NetworkServerEvent()
 
    If SEvent
   
      ClientID = NetworkClientID()
 
      Select SEvent
     
        Case 1
          PrintN("Ein neuer Client hat sich angemeldet !")
         ;################# 
         AddElement(Clients())
         Clients() = NetworkClientID()
         ;###################
        Case 2
        RtlZeroMemory_(Buffer, 1000)
        ReceiveNetworkData(NetworkClientID(), Buffer, 1000)
        PrintN(""+ PeekS(Buffer))

        Case 3
          PrintN("Client "+ Str(ClientID) + " hat die Verbindung beendet...")
   
   
   

   
      EndSelect
       ;#################
       ;Da kannst du auch machen, was immer du willst.
       If Random(200) = 0 ;Per Zufall ermitteln
         ForEach Clients()
            SendNetowrkString(Clients(),"Ich bin lustig! :)")
         Next
       EndIf
     ;####################
    EndIf
   
  Until Quit = 1
 
  PrintN("Klicke zum beenden des Servers.")
  Input()
  CloseNetworkServer()
Else
  PrintN("Konnte Server nicht erstellen (Wird der Port bereits benutzt ?).")
EndIf

 
End 
Benutzeravatar
AirTokio
Beiträge: 22
Registriert: 13.06.2005 21:12

Beitrag von AirTokio »

So hab das jetzt alles eingefügt!
Wenn man mit einem Client beendet kommt trotzdem keine Naricht !?!
Und wenn man mit 2 clients verbindet, kommt auf den Clients auch nicht das geschriebene!
Kanns an dem Client liegen?

Hier der Code:

Code: Alles auswählen

OpenConsole()                                              
 
ConsoleTitle("Client")                              
ConsoleColor (15, 0)


If InitNetwork() = 0
   PrintN("Kein Netzwerk gefunden!")
  End
EndIf


Port = 6832
ConnectionID = OpenNetworkConnection("127.0.0.1", Port)


PrintN("Willkommen zu NextConextion!")
PrintN("")
Delay(2000)
Print("Verbindung wird hergestellt")
Delay(1000)
Print(".")
Delay(1000)
Print(".")
Delay(1000)
Print(".")
Delay(1000)
PrintN(".")
PrintN("")

If ConnectionID
  PrintN("Client ist verbunden mit Server...")
  Delay(1000)
  ClearConsole ()

PrintN("Willkommen zum Chat!")
PrintN("")
     
Repeat
     
   
PrintN("")
string$ = Input ()
SendNetworkString(ConnectionID, String$)


     
   
ForEver
  

Else
  PrintN("Konnte Server nicht finden!")
EndIf

Input ()
  
End
Benutzeravatar
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:

Beitrag von HeX0R »

Das hier is übrigens Quark, oder anders gesagt : Mit Kanonen auf Spatzen geschossen:

Code: Alles auswählen

RtlZeroMemory_(Buffer, 1000)
ReceiveNetworkData(NetworkClientID(), Buffer, 1000)
PrintN(""+ PeekS(Buffer))
Besser wäre:

Code: Alles auswählen

Length.l = ReceiveNetworkData(NetworkClientID(), Buffer, 1000)
PrintN(PeekS(Buffer, Length))
Kein Mensch löscht nen ganzen Buffer, wenn er nur nen mickrigen String erwartet.

Warum keine Meldung beim Disconnect kommt ?

Naja, weil du Event 4 und nicht 3 überprüfen solltest...

Ausserdem sendet dein Server eh nur ser selten was zu den Clients (siehe dieses seltsame Random(200) = 0 )

Besser du packst das:

Code: Alles auswählen

ForEach Clients()
  If Clients() <> ClientID
    SendNetworkString(Clients(), PeekS(Buffer, Length))
  EndIf
Next
direkt unter das (s.o.):

Code: Alles auswählen

PrintN(PeekS(Buffer, Length))
Da deine CLients aber im Input() festhängen und keinerlei Signale vom Server auswerten, wirst du trotzdem nie ne Meldung kriegen!
Das werd ich aber nu nicht auch noch erklären, selbst is der Mann...

Ausserdem sollte man *Buffer anstatt Buffer schreiben.
So lässt sich ein Pointer gleich optisch von ner Variablen unterscheiden.
Antworten