Chatprogramm

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
AirTokio
Beiträge: 22
Registriert: 13.06.2005 21:12

Chatprogramm

Beitrag von AirTokio »

Nachdem ihr mir geraten habt nen bisschen mit der Konsole zu programmieren, sitzte ich jetzt hier und komme nicht weiter!

Hab ein Chatprogramm geproggt, mit einer Server -> Client Kombination.

Hier mein 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  
          ReceiveNetworkData(ClientID, Buffer, 10000)
          PrintN(""+PeekS(Buffer))
          ReceiveNetworkData(ConnID, @Text, 500)
          
          
          
          
   
        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
Und hier mein Client

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

So weit so gut :allright:
Nur wie mach ich es nun, dass man was schreibt (also input + Variable) der es dem Server weiterschickt und dieser wiederum alles allen Clients weiterschickt?
Zuletzt geändert von AirTokio am 14.06.2005 17:49, insgesamt 1-mal geändert.
Sonne
Beiträge: 4
Registriert: 12.06.2005 12:56

Beitrag von Sonne »

so, ich hab auch mal einen server geschrieben, der sollte dir eingtlich gut helfen, deinen fehler zu finden :)

Code: Alles auswählen

If InitNetwork() = 0 
  End 
Else 
EndIf 

If CreateNetworkServer(Port) 
  Repeat 
If NetworkServerEvent() = 2
ReceiveNetworkData(NetworkClientID(), Buffer, 10000)
MessageRequester("Message from Root", PeekS(Buffer),0)
EndIf
  ForEver 
  
  CloseNetworkServer() 
  
Else 
EndIf 
Ich denke mal, dass dein Fehler da beim Case ist ... also die reihe darunter :)
Benutzeravatar
AirTokio
Beiträge: 22
Registriert: 13.06.2005 21:12

Beitrag von AirTokio »

So hab den Code mal verändert

Code: Alles auswählen

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  
        ReceiveNetworkData(NetworkClientID(), Buffer, 1000)
        PrintN(""+ PeekS(Buffer))
              
        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
Nun wenn man etwas schreibt zeigt er es schonam im Server Fenster an (!!!), wenn ich jedoch im Client Morgeeen schreibe, zeigt er es im Server an. Wenn ich nun als nächstes nur a schreibe zeigt er aorgeeen an!
Also irgendwas funktioniert da noch nicht! Genauso bemerkt der Server es nicht, wenn der Client beendet! Was ist also an Case 4 falsch?
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Das liegt daran, dass der Buffer nach ende eines Schleifendurchlaufes nicht geleert wird ;). Abhilfe könnte diese Funktion schaffen, sofern ihr über die Vollversion verfügt: http://msdn.microsoft.com/library/defau ... 4b.xml.asp
Bild
Benutzeravatar
AirTokio
Beiträge: 22
Registriert: 13.06.2005 21:12

Beitrag von AirTokio »

Ja hab mir schon gedacht, dass es am Buffer liegt!
So aber mit der Microsoft seite komm ich gar nicht klar!
Hab die Vollversion von PureBasic aber wo und was muss ich zum leeren eingeben?
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Ersetz die Zeile

Code: Alles auswählen

ReceiveNetworkData(NetworkClientID(), Buffer, 1000)
durch diese Zeilen

Code: Alles auswählen

RtlZeroMemory(Buffer, 1000)
ReceiveNetworkData(NetworkClientID(), Buffer, 1000)
Mit der MSDN sollte man aber umgehen können, wenn man unter Windows was gescheites programmieren will ;). Ohne API kommt man selten sehr weit.
Bild
Benutzeravatar
AirTokio
Beiträge: 22
Registriert: 13.06.2005 21:12

Beitrag von AirTokio »

Danke!
Jedoch beim Starten macht er immer einen Fehler:
Zeile 34: RtlZeroMemory() is not a function, an array, or a linked list!

Hier ist mein Quelltext:

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))
             
        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
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Code: Alles auswählen

RtlZeroMemory(Buffer, 1000)
ReceiveNetworkData(NetworkClientID(), Buffer, 1000)
Mit der MSDN sollte man aber umgehen können, wenn man unter Windows was gescheites programmieren will Wink. Ohne API kommt man selten sehr weit.
Verwechsel eine User-Lib mal lieber nicht mit der Windows-API, wobei ich deiner Aussage in Teilen zustimmen muss...
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Spirit
Beiträge: 174
Registriert: 13.04.2005 19:09

Beitrag von Spirit »

Da muss noch ein '_' dazwischen, also

Code: Alles auswählen

RtlZeroMemory_(Buffer, 1000)
EDIT: Ach er meint eine User-Lib? Na dann muss doch kein '_' dazwischen.
Benutzeravatar
AirTokio
Beiträge: 22
Registriert: 13.06.2005 21:12

Beitrag von AirTokio »

Nee stimmt schon der muss dazwischen ;)
Jetzt funzt das auf jedenfall schon!!! DANKE :)

So nun funktioniert bloss nicht mehr, das der Server es meldet, wenn der Client beendet wird!

Und ich brauch noch, dass er jeden client, der Verbunden is (aus dem der es geschrieben hat) diese Naricht zu schickt!

Aber jetzt schonmal fettes dankeschön für eure Hilfe :allright:
Zuletzt geändert von AirTokio am 14.06.2005 20:30, insgesamt 1-mal geändert.
Antworten