Client bleibt nicht mit Server verbunden

Anfängerfragen zum Programmieren mit PureBasic.
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Client bleibt nicht mit Server verbunden

Beitrag von cofter »

Hi,

ich habe noch eine kleine Frage. :oops:

Ich habe einen kleinen Server und einen Clienten geschrieben. ( mit viel hilfe der Dokumentation)

Der Client verbindet sich mit dem Server und Sendet einen String.
Leider Disconnectet der Client auch wieder sofort nach dem Senden.
Gibt es eine möglichkeit solang die Verbindung aufrecht zu erhalten bis der Client beendet wird?

Bitte nicht hauen wenn ich wieder was in der Doku übersehen habe.

mfg
Cofter
Benutzeravatar
winduff
Beiträge: 879
Registriert: 10.02.2006 21:05
Wohnort: Gießen
Kontaktdaten:

Beitrag von winduff »

code bitte

warscheilich haste beim senden die verbindung wieder geschlossen?! Vielleicht übersehen?
Bild
AND51 hat geschrieben:...und ich würde dein Programm aus Wut zwei mal installieren, um eines genüsslicher löschen zu können, als das andere...
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag von cofter »

*huch* Sorry der Code.... :shock:

Client:

Code: Alles auswählen

;---------------------
; Constanten
;---------------------

#window = 001

#screen_w = 800
#screen_h = 600
;---------------------
; Constanten ende
;---------------------

If InitEngine3D()
   ;  MessageRequester("3D Engine","Die Engine wurde gestartet!")
    
    engine.b = 1
Else
    MessageRequester("3D Engine","Die Engine konnte nicht gestartet werden!")
    
    engine.b = 0
    End
EndIf

If engine = 1
  ; MessageRequester("3D Engine","Es hat geklappt und geht weiter im code")
  
  in_db = InitDatabase()
  db_examine = ExamineDatabaseDrivers()
  db_driver = NextDatabaseDriver()
  db_descript$ = DatabaseDriverDescription()
  db_driver_name$ = DatabaseDriverName() 
  
  If db_examine = 0
    ; MessageRequester("DB Driver","Fehler im odbc bereich!")
    End
  Else
    ; MessageRequester("Db Driver","Die Treiber: " +db_descript$) 
    
    db_go.b = 1
  EndIf
  
Else
  MessageRequester("3D Engine","Es ist ein Fehler aufgetreten")
  End
EndIf

If engine = 1 And db_go = 1
  InitNetwork()
  
  OpenConsole()
  PrintN("Engine gestartet...")
  Delay(1000)
  PrintN("Datenbanktreiber gefunden...")
  Delay(1500)
  PrintN("Initialisiere System...")
  Delay(1000)
  PrintN("Verbinde zum WeltenServer")
  Delay(1000)
  connectionID = OpenNetworkConnection("192.168.0.6",7000)
  
  If connectionID
    PrintN("")
    PrintN("Verbindung hergestellt")
    SendNetworkString(ConnectionID, "Bin ich schon drin?")
  Else
  
    PrintN("Konnte nicht zum Server verbinden!")
  EndIf
  
  Repeat
      KeyPressed$ = Inkey()
      
  Until KeyPressed$ = Chr(27) ; Wartet, bis Escape gedrückt wird
  
  window.b = 0
  
EndIf
 
If window = 1

  ;------------------------------------------
  ; initialisieren
  ;------------------------------------------
    InitSprite()
    OpenScreen(#screen_w,#screen_h,32,"Solania")
    InitKeyboard()
 
    CreateCamera(0, 0, 0, 100, 100)
  ;---------------------
  ; initialisieren ende
  ;---------------------
    
  Repeat 
  fps = Engine3DFrameRate(#PB_Engine3D_Current)

  RenderWorld()
  
  ExamineKeyboard()
  Until KeyboardPushed(#PB_Key_Escape)
  
  End
EndIf
Benutzeravatar
winduff
Beiträge: 879
Registriert: 10.02.2006 21:05
Wohnort: Gießen
Kontaktdaten:

Beitrag von winduff »

naja, woher weist du dass sie sofort wieder ausgeht?

Da du in der repeatschleife keine abfrage drin hast, die auf den client wartet (auf aktivitäten) kannst du das glaube ich auch nicht nachvollziehen....

selbst wenn -> wenn keine aktivität vorliegt, schließt sich die verbindung vielleicht.... weis es aber nicht....

Lg
Chris
Bild
AND51 hat geschrieben:...und ich würde dein Programm aus Wut zwei mal installieren, um eines genüsslicher löschen zu können, als das andere...
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag von cofter »

Der Server gibt mir das aus.
Was mir auch noch zu schaffen macht ist das der String nicht beim Server ankommt bzw. leer ist.
Oder muss ich dem Clienten unbedingt was zurückschicken?
Hier noch der Code vom Server.

Server:

Code: Alles auswählen

;--------------------
; Server
;--------------------
#title = "Server"
#ip = "192.168.0.6"
#port = "7000"
;-------------------------

InitNetwork()


  If OpenConsole()
    PrintN("Druecken Sie Escape zum Beenden.")
    PrintN("")
    PrintN(#title)
    PrintN("")
    If CreateNetworkServer(01,7000)
      PrintN("Server wurde gestartet...")
      PrintN("")
    Else
      PrintN("Server konnte nicht gestartet werden!")
    EndIf
    
    Repeat
      KeyPressed$ = Inkey()
      SEvent = NetworkServerEvent()
      
      client_event = EventClient()
     
      
      Select SEvent
        Case 1
          PrintN("Neuer Client ist connectet " +Str(client_event))
        Case 2
          PrintN("Client-> "+Str(client_event)+" sendet Packets!")
          ReceiveNetworkData(client_event, Buffer, 5000)
          PrintN("String: "+PeekS(Buffer))
        Case 3
          PrintN("Client versucht Datei zu schicken!")
        Case 4
          PrintN("Client-> "+Str(client_event)+" verlaesst den Server!")
      EndSelect
       
    Until KeyPressed$ = Chr(27) ; Wartet, bis Escape gedrückt wird
  EndIf
Benutzeravatar
winduff
Beiträge: 879
Registriert: 10.02.2006 21:05
Wohnort: Gießen
Kontaktdaten:

Beitrag von winduff »

Hmm da stimmen ein paar sachen nicht, auch hast du keinen Speicher freigegeben (ALlocatememory), aber der Fehler dürfte dir erst auftreten sobald case 2 beim server ausgerführt wird.

Hier für dich ein client-server beispiel:

Server:

Code: Alles auswählen

Procedure run_()
  OpenConsole()
  ConsoleColor(15,0):PrintN("") : PrintN("") : PrintN("")
  Print("Initialize Network.......") 
  If InitNetwork()
     Delay(1) : ConsoleColor(2,0) : PrintN("Done") : ConsoleColor(15,0) : PrintN("")
  EndIf
  Print("Starting server......")
   If CreateNetworkServer(0,6000)
    Delay(1) : ConsoleColor(2,0) : PrintN("Done") : ConsoleColor(15,0) : PrintN("")
  Else
    ConsoleColor(4,0) : PrintN("Failed") : ConsoleColor(15,0) : PrintN("")
  EndIf
  PrintN("--------------------------------------------------------------------------------")
EndProcedure
Procedure result(Command$,result)
  If result = 1
    PrintN("- Client called command: "+Command$+" Result: Done")
  Else
    PrintN("- Client called command: "+Command$+" Result: ERROR")
  EndIf 
EndProcedure
Procedure msg(newstring$)
  MessageRequester("Info",newstring$,#MB_ICONINFORMATION)
EndProcedure
  Procedure commandlist()
    *Command = AllocateMemory(10000) 
    ReceiveNetworkData(EventClient(),*Command,10000)
    Command$ = PeekS(*Command)
    FreeMemory(*Command)
    If FindString(Command$,"msg",0)
      newstring$ = RemoveString(Command$,"msg")
      CreateThread(@msg(),newstring$)
      SendNetworkString(EventClient(),"Info sent!")
      result(Command$,1)
    Else
      SendNetworkString(EventClient(),"Command error!")
      result(Command$,0)
    EndIf      
  EndProcedure

run_()

Repeat
  Delay(1)
  Select NetworkServerEvent()
    Case 1
      ConsoleColor(2,0) : PrintN("---- Client connected!") : ConsoleColor(15,0)
    Case 2
      commandlist()
      
      Case 4
        ConsoleColor(2,0):PrintN("---- Client disconnected!") : ConsoleColor(15,0)
        EndSelect
ForEver
Client:

Code: Alles auswählen

Global connected, ConnID
Procedure run_()
  OpenConsole()
  PrintN(""):PrintN(""):PrintN(""):PrintN("")
  PrintN("                               NetBuster v0.1 Client")
  PrintN("                         Copyright (c) 2006 by Eimex.de")
  PrintN("--------------------------------------------------------------------------------")
  ConsoleColor(15,0)
  Print("Initialize Network.......") 
  If InitNetwork()
    Delay(1) : ConsoleColor(2,0) : PrintN("Done") : ConsoleColor(15,0) : PrintN("")
  EndIf
  Print("Connecting...............")
  ConnID = OpenNetworkConnection("127.0.0.1",6000)
  If ConnID
    Delay(1) : ConsoleColor(2,0) : PrintN("Done") : ConsoleColor(15,0) : PrintN("")
    connected = 1
  Else
    ConsoleColor(4,0) : PrintN("Failed") : ConsoleColor(15,0) : PrintN("") : PrintN("Program could not connect, press ENTER to exit.")
    connected = 0
  EndIf
    PrintN("--------------------------------------------------------------------------------")
EndProcedure
Procedure recieve_answer(ConnID)
  Repeat
    Delay(1)
    Select NetworkClientEvent(ConnID)
      Case 2
        *Command = AllocateMemory(5000) 
        ReceiveNetworkData(ConnID,*Command,10000)
        Command$ = PeekS(*Command)
        ConsoleColor(4,0)
        Print("|| "+Command$) : ConsoleColor(15,0) : PrintN("")
        FreeMemory(*Command)
    EndSelect
  ForEver
EndProcedure

run_()
If connected = 0 : Input() : End : EndIf
Repeat
  Print("")
  Command$ = Input()
SendNetworkString(ConnID,Command$)
CreateThread(@recieve_answer(),ConnID)
ForEver
- Server starten
- Client starten

- Befehle schreiben, wie msg nachricht

oder einfach irgend nen text: was passiert ist: client sendet text, server empfängt text und schaut ob es nen befehl ist. falls ja, führt er den befehl aus, falls nicht, sendet er nen error an den clienten.

Schau dir dort einfach die Repeatschleife an und wie daten empfangen/gesendet werden.

Der source ist von nem angefangenen programm von mir, was ic haber (noch) nicht weiterprogge, du darfst den code v. dh frei nutzen ;-) Ist ja nicht viel :-P
Bild
AND51 hat geschrieben:...und ich würde dein Programm aus Wut zwei mal installieren, um eines genüsslicher löschen zu können, als das andere...
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag von cofter »

Danke für den Beispielcode, hat mir sehr geholfen.
Bin jetzt auch dazu übergegangen alles in Prozeduren zu packen.

OOP kann PB nicht oder?
Wenn nicht kann ich damit auch lernen zu leben. :)



mfg
Cofter
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> OOP kann PB nicht oder?

jain

such mal im forum nach OOP. es gibt z.b. preparser, um OOP-code umzusetzen.
weiterhin besitzt PB interfaces, das sind objektschnittstellen. damit ist rudimentäres OOP möglich.

aber darüber gibts schon 37 themen, braus einfach mal das forum...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
cofter
Beiträge: 84
Registriert: 10.03.2006 19:07
Wohnort: Berlin
Kontaktdaten:

Beitrag von cofter »

Danke für den Hinweis.

Werde aber in Pb auf OOP verzichten.
Habe gelesen das Fred wohl auch kein OOP in Pb einführen möchte,
Plugins und PreParser möcht ich nicht verwenden.

mfg
Cofter
Was ich nicht kenne das mach ich kaputt! :D
----------------------------------------------------
Purebasic v4.0
Antworten