Char Probleme mit Server!

Für allgemeine Fragen zur Programmierung mit PureBasic.
netfreak
Beiträge: 91
Registriert: 23.10.2004 18:30
Kontaktdaten:

Char Probleme mit Server!

Beitrag von netfreak »

Hallo,
Ich habe angefangen eine Chat Programm zu schreiben!
Ihr erstmal der Client:

Code: Alles auswählen


;client
InitNetwork() 


 OpenWindow(0,100,100,500,400,#PB_Window_SystemMenu,"Chat")
 CreateGadgetList(WindowID())
    ButtonGadget(1,390,340,100,20,"Senden")
    StringGadget(3, 10, 340, 370, 20, "") 
    EditorGadget(2, 10, 10, 480, 300)
Buffer = AllocateMemory(1000)
ConnectionID = OpenNetworkConnection("127.0.0.1", 600)
  Repeat
  ;Fenster
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow 
      Quit = 1
    EndIf
    If EventID = #PB_Event_Gadget
      If EventGadgetID()=1
        Text$ = GetGadgetText(3)
        SendNetworkString(ConnectionID, Text$)
        SetGadgetText(3, "")
      EndIf
    EndIf
    
    

    CEvent.l = NetworkClientEvent(ConnectionID)

    Select CEvent
      
        Case 2
          
          ReceiveNetworkData(ConnectionID, Buffer, 1000)
          AddGadgetItem(2, -1, PeekS(Buffer)) 
         
         ;2 : Roh-Daten wurden empfangen (können mittels ReceiveNetworkData() gelesen werden)  

        Case 3
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a file via the network !", 0)
          ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3")
          ; 3 : Eine Datei wurde empfangen (kann mittels ReceiveNetworkFile() gelesen werden) 
    EndSelect
     
  Until Quit=1

End
So und nun zum Server und zwar kann ich immer nur mit einenem Client reden und der Cleint auch nur mit der Server ich möchte aber der Server mit jedem Client reden kann und der Client auch mit andern Clients reden kann nur wie stell ich das an?

Ihr Code vom Server:

Code: Alles auswählen


;Server
InitNetwork() 
CreateNetworkServer(600)

 OpenWindow(0,100,100,500,400,#PB_Window_SystemMenu,"Server")
 CreateGadgetList(WindowID())
    ButtonGadget(1,390,340,100,20,"Senden")
    StringGadget(3, 10, 340, 370, 20, "") 
    EditorGadget(2, 10, 10, 480, 300)
Buffer = AllocateMemory(1000)

  Repeat
  ;Fenster
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow 
      Quit = 1
    EndIf
    If EventID = #PB_Event_Gadget
      If EventGadgetID()=1
        Text$ = GetGadgetText(3)
        SendNetworkString(ClientID, Text$)
        SetGadgetText(3, "")
      EndIf
    EndIf
    
    
    ;Server
    SEvent.l = NetworkServerEvent()
  
    ;If SEvent
    
      ClientID = NetworkClientID()
  
      Select SEvent
      
        Case 1
          AddGadgetItem(2, -1, "Ein Neuer Chater ist online!")
          ;SendNetworkString(ClientID, "Ein Neuer Chater ist online!")
          ;1: Ein neuer Client wurde mit dem Server verbunden 
  
        Case 2
          ;MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a packet !", 0)
          ReceiveNetworkData(ClientID, Buffer, 1000)
          AddGadgetItem(2, -1, PeekS(Buffer))
          ;MessageRequester("Info", "String: "+PeekS(Buffer), 0)
          ; 2 : Roh-Daten wurden empfangen (können mittels ReceiveNetworkData() gelesen werden,) 
        ;Case 3
          ;MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a file via the network !", 0)
          ;ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3")
          ; 3 : Eine Datei wurde empfangen (kann mittels ReceiveNetworkFile() gelesen werden) 
        Case 4
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connexion...", 0)
          Quit = 1
          ;4 : Ein Client hat den Server verlassen (Verbindungstrennung) 
      EndSelect

           
  Until Quit=1

End
Bin für jede Antwort dankbar!
mfg
netfreak
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Client:

Code: Alles auswählen

;client 
InitNetwork() 


OpenWindow(0,100,100,500,400,#PB_Window_SystemMenu,"Chat") 
CreateGadgetList(WindowID()) 
ButtonGadget(1,390,340,100,20,"Senden") 
StringGadget(3, 10, 340, 370, 20, "") 
EditorGadget(2, 10, 10, 480, 300) 
Buffer = AllocateMemory(1000) 
ConnectionID = OpenNetworkConnection("127.0.0.1", 600) 
Repeat 
  ;Fenster 
  EventID = WindowEvent() 
  If EventID = #PB_Event_CloseWindow 
    quit = 1 
  EndIf 
  If EventID = #PB_Event_Gadget 
    If EventGadgetID()=1 
      Text$ = GetGadgetText(3) 
      SendNetworkString(ConnectionID, Text$) 
      SetGadgetText(3, "") 
    EndIf 
  EndIf 
  If EventID = 0
    Delay(100)
  EndIf
  
  
  CEvent.l = NetworkClientEvent(ConnectionID) 
  
  Select CEvent 
    
    Case 2 
      
      ReceiveNetworkData(ConnectionID, Buffer, 1000) 
      AddGadgetItem(2, -1, PeekS(Buffer)) 
      
      ;2 : Roh-Daten wurden empfangen (können mittels ReceiveNetworkData() gelesen werden)  
      
    Case 3 
      MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a file via the network !", 0) 
      ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3") 
      ; 3 : Eine Datei wurde empfangen (kann mittels ReceiveNetworkFile() gelesen werden) 
  EndSelect 
  
Until quit=1 

FreeMemory(Buffer)

End
Server:

Code: Alles auswählen

;Server 
NewList Client.l()

InitNetwork() 
CreateNetworkServer(600) 

OpenWindow(0,100,100,500,400,#PB_Window_SystemMenu,"Server") 
CreateGadgetList(WindowID()) 
ButtonGadget(1,390,340,100,20,"Senden") 
StringGadget(3, 10, 340, 370, 20, "") 
EditorGadget(2, 10, 10, 480, 300) 
Buffer = AllocateMemory(1000) 

Repeat 
  ;Fenster 
  EventID = WindowEvent() 
  If EventID = #PB_Event_CloseWindow 
    quit = 1 
  EndIf 
  If EventID = #PB_Event_Gadget 
    If EventGadgetID()=1 
      Text$ = GetGadgetText(3) 
      ForEach Client()
        SendNetworkString(Client(), Text$) 
      Next
      SetGadgetText(3, "") 
    EndIf 
  EndIf 
  If EventID = 0
    Delay(100)
  EndIf
  
  
  ;Server 
  SEvent.l = NetworkServerEvent() 
  
  ;If SEvent 
  
  ClientID = NetworkClientID() 
  
  Select SEvent 
    
    Case 1 
      AddGadgetItem(2, -1, "Ein Neuer Chater ist online!") 
      AddElement(Client())
      Client() = ClientID
      ;SendNetworkString(ClientID, "Ein Neuer Chater ist online!") 
      ;1: Ein neuer Client wurde mit dem Server verbunden 
      
    Case 2 
      ;MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a packet !", 0) 
      ReceiveNetworkData(ClientID, Buffer, 1000)
      AddGadgetItem(2, -1, PeekS(Buffer))
      ForEach Client()
        If Client() <> ClientID
          SendNetworkString(Client(), PeekS(Buffer))
        EndIf
      Next
      ;MessageRequester("Info", "String: "+PeekS(Buffer), 0) 
      ; 2 : Roh-Daten wurden empfangen (können mittels ReceiveNetworkData() gelesen werden,) 
      ;Case 3 
      ;MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a file via the network !", 0) 
      ;ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3") 
      ; 3 : Eine Datei wurde empfangen (kann mittels ReceiveNetworkFile() gelesen werden) 
    Case 4 
      MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connexion...", 0) 
      quit = 1 
      ;4 : Ein Client hat den Server verlassen (Verbindungstrennung) 
  EndSelect 
  
  
Until quit=1 

FreeMemory(Buffer)

End
Es ist nicht sinnvoll bei Netzwerksachen WaitWindowEvent() zu nehmen weil dann erst etwas empfangen wird wenn ein Event auftritt desswegen hab ich das zu WindowEvent() geändert.
Zuletzt geändert von Deeem2031 am 08.11.2004 23:11, insgesamt 1-mal geändert.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Nochwas: Wenn da Daten empfängst solltest du entweder zuerst den Buffer leeren (alle Bytes auf 0 setzen) oder die Länge speichern und dementsprechend auslesen:

Code: Alles auswählen

RtlZeroMemory_(Buffer,1000)
ReceiveNetworkData(ConnectionID, Buffer, 1000) 
AddGadgetItem(2, -1, PeekS(Buffer))

Code: Alles auswählen

Length = ReceiveNetworkData(ClientID, Buffer, 1000)
AddGadgetItem(2, -1, PeekS(Buffer,Length))
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag von MLK »

oder, wie ich es gerne mache:

Code: Alles auswählen

AddGadgetItem(2, -1, PeekS(Buffer,ReceiveNetworkData(ClientID, Buffer, 1000)))
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

So würde ich das zwar auch machen, das ist aber für manche Leute zu "unsauber". Danilo ist z.B. einer davon, der meckert selbst bei "CreateGadgetList(OpenWindow(0,0,0,200,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,""))" :wink:
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Ich muss sagen: Das gefällt mir auch nicht. Das sieht echt grauselig aus, auch wenn ich erst nach 10s gecheckt hab, was Danilo dran nicht mögen könnte.
netfreak
Beiträge: 91
Registriert: 23.10.2004 18:30
Kontaktdaten:

Beitrag von netfreak »

@Deeem2031: Danke für deinen Tipp und die Lösung!
mfg
netfreak
netfreak
Beiträge: 91
Registriert: 23.10.2004 18:30
Kontaktdaten:

Beitrag von netfreak »

Noch ne Frage! Wie so:

Code: Alles auswählen

  If EventID = 0 
    Delay(100) 
  EndIf 
Warum soll ich ne Pause machen wenn der Benutzer nix gedrückt hat?
mfg
netfreak
Benutzeravatar
Kiffi
Beiträge: 10725
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Warum soll ich ne Pause machen wenn der Benutzer nix gedrückt hat?
Online-Handbuch hat geschrieben: Delay ist insbesondere nützlich in Ereignis-Warteschleifen mit WindowEvent()
oder ExamineKeyboard(), um nicht die gesamte Rechenzeit zu "schlucken".
Im Klartext: Dein Programm macht Pause, damit die anderen Programme,
die auf Deinem Rechner laufen, auch ein wenig von kostbaren Prozessorzeit
abbekommen.

Grüße ... Kiffi
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag von Lebostein »

Oh, ja! Delay() bei WindowEvent() unbedingt mit reinnehmen!!

Bei schnellen Prozessoren wird man nicht viel merken, aber ich hab z.B. noch ne alte 350MHz Kiste, da fällt sofort auf, wenn jemand WindowEvent() ohne Delay() nutzt, denn dann fängt der gesamte "Windows-Betrieb" an zu ruckeln :mrgreen:
Antworten