Seite 1 von 1

Client + Server

Verfasst: 22.02.2005 21:23
von Salami
Also ich wollte ein Programm machen, bei dem man über den Client den Server steuern kann. Aber irgendwie will das nicht so ganz funktionieren...
Es soll beim server eigentlich eine Nachricht mit dem Namen "hallo" aufpoppen also in einem messagerequester. Ich bekomme aber immer ein leeres alert endlos lange bis ich den clienten schliesse. Hab keine Ahnung was ich falsch mache.... :?

Hier mal der Code:

Server.exe:

Code: Alles auswählen

OpenWindow(0, 200, 200, 300, 70, #PB_Window_SystemMenu, "Server")

If InitNetwork() = 0
  End
EndIf
socket.l = CreateNetworkServer(6500)
If socket = 0
  End
EndIf

Repeat
  EventID=WaitWindowEvent()
  
  If NetworkServerEvent() = 2
    nachricht$="   "
    ReceiveNetworkData(socket, @nachricht$, 500)
    MessageRequester("Meldung", nachricht$, 0)
  EndIf
  
  If EventID=#PB_EventCloseWindow
    exit=1
  EndIf
  
Until exit=1
End
Client.exe:

Code: Alles auswählen

OpenWindow(0, 0, 0, 300, 200, #PB_Window_SystemMenu|#PB_Window_ScreenCentered, "Network Client")
CreateGadgetList(WindowID())
StringGadget(0, 5, 5, 200, 20, "IP")
ButtonGadget(1, 5, 25, 100, 20, "Verbinden!")
ButtonGadget(2, 5, 50, 100, 20, "PopUp")

Repeat

  EventID=WaitWindowEvent()
  
  If InitNetwork()=0
    MessageRequester("Kein Netzwerk", "Kein Netzwerk gefunden", 0)
  EndIf

  If EventID=#PB_Event_Gadget
    If EventGadgetID()=1
      ConnID.l = OpenNetworkConnection(GetGadgetText(0),6500)
      If ConnID = 0
        MessageRequester("Kein Server", "Kein Server läuft unter dieser Adresse", 0)
      Else
        MessageRequester("Verbunden", "Erfolgreich zum Server verbunden!", 0)
      EndIf
    EndIf

    If EventGadgetID()=2
      nachricht$ = "hallo"
      SendNetworkData(ConnID, @nachricht$, Len(nachricht$))
      Delay(1000)
    EndIf
  EndIf

  If EventID = #PB_EventCloseWindow: exit=1: EndIf
  
Until exit=1
End
Ausserdem weis ich nicht wann man genau ein @ vor eine Variable stellt und was der unterschied zwischen variable$ und variable.s ist...
Ich hab mir Server und Client aus dem Purearea.de Codearchiv genommen und einige zeilen mehr oder weniger abgeschrieben.. eigentlich versteh ich das ganze schon ausser den variablen...

danke

Verfasst: 22.02.2005 21:31
von bluejoke
kann dir momentan nur die Frage mit den variablen beantworten:
string.s und string$ sind 2 verschiebene Variablen, die Endungen definieren aber den selben Typ.

@ gibt einen Zeiger auf diese Variable oder Prozedur zurück.
Muss man immer hinschreiben, wenn bei der Syntax des Befehls irgendwas mit * als Parameter steht (also Beispielsweise BeispielProc(*hnd)

Der Letzte Absatz nur unter Vorbehalt! Damit kenn ich mich nicht aus.

Verfasst: 22.02.2005 21:43
von MVXA

Code: Alles auswählen

  If NetworkServerEvent() = 2
    nachricht$="   "
    ReceiveNetworkData(socket, @nachricht$, 500)
    MessageRequester("Meldung", nachricht$, 0)
  EndIf 
Na, das ist aber so nicht ganz richtig :lol:. Wenn du der Prozedur sagst, dass in der Variable 500 Zeichen frei sind, dann musste auch wirklich die 500 Zeichen frei machen. Mach es doch einfach so: nachricht$= space(500). Space() füllt eine Variable beliebig viel mit Leerzeichen.

Verfasst: 22.02.2005 21:54
von Salami
Ok danke...
Jetzt kommt ein großes leeres alert^^ (oder eben mit leerzeichen gefüllt)

Verfasst: 22.02.2005 22:03
von MVXA
Versuch mal das:

Code: Alles auswählen

  If NetworkServerEvent() = 2
    nachricht$=Space(500)
    ReceiveNetworkData(socket, @nachricht$, 500)
    if trim(nachricht$) <> ""
        MessageRequester("Meldung", nachricht$, 0)
    endif
  EndIf 

Verfasst: 22.02.2005 22:18
von Salami
Hm.. es ist schon besser... jetzt kommt garnichts - irgendwie kommt meine nachricht nicht durch...

Verfasst: 22.02.2005 22:24
von MVXA
Ehm, hab den Fehler :|. Versuch mal das :D:

Code: Alles auswählen

  If NetworkServerEvent() = 2
    nachricht$=Space(500)
    ReceiveNetworkData(NetworkClientID(), @nachricht$, 500)
    if trim(nachricht$) <> ""
        MessageRequester("Meldung", nachricht$, 0)
    endif
  EndIf
Problem war dass wir den Socket vom Server auf Nachrichten überprüft haben. Aber wenn der Client connectet bekommt er nochmal eine eigene ID auf dem die Daten dann liegen. Die ID kann man dann mit NetworkClientID() abrufen.

Verfasst: 23.02.2005 16:12
von Salami
THX geht wunderbar :D

Verfasst: 23.02.2005 18:09
von MVXA
Ich hoffe, dass du auch verstanden hast wo der fehler lag ;).