Chat Problem

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Fox
Beiträge: 75
Registriert: 08.08.2007 10:14
Kontaktdaten:

Chat Problem

Beitrag von Fox »

Hi Leute... Ich programmiere zur Zeit einen Kleinen Chat... Nur jetzt habe ich schon Probleme :(... Ich will einen Clienten als Server laufen lassen.
Der soll extra sein... Die ganz normalen Clienten sollen einfach nur zum Chatten geeignet sein. Hier mein Code

Code: Alles auswählen

Name$ = InputRequester("", "Geben Sie ihren Nickname ein", "")
  If Input$ > ""
    a$ + Name$                                                  
  Else  
  EndIf

Leer$ = ":" + Space(3) 
  
Input$ = InputRequester("Verbinden...", "", "")
  If Input$ > ""
    a$ + Input$                                                  
  Else  
  EndIf
OpenWindow(0,0,0,685,372, "Ultimative Chat", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
CreateGadgetList(WindowID(0))
EditorGadget(2, 0, 0, 560, 170,#PB_Editor_ReadOnly)
SetGadgetColor(2,#PB_Gadget_BackColor,black) 
SetGadgetColor(2,#PB_Gadget_FrontColor,65280) 
ListViewGadget(3, 570, 0, 110, 370)
SetGadgetColor(3,#PB_Gadget_BackColor,black) 
SetGadgetColor(3,#PB_Gadget_FrontColor,255) 
StringGadget(0, 0, 180, 460, 180, "")
SetGadgetColor(0,#PB_Gadget_BackColor,black) 
SetGadgetColor(0,#PB_Gadget_FrontColor,16777215) 
ButtonGadget(1, 470, 310, 90, 40, "Senden")
If InitNetwork() = 0: End: EndIf                       
Socket.l = CreateNetworkServer(#PB_Any,6000) 
If Socket = 0: End: EndIf

#FD_ALL = #FD_READ|#FD_WRITE|#FD_OOB|#FD_ACCEPT|#FD_CONNECT|#FD_CLOSE
WSAAsyncSelect_(Socket, WindowID(0), #WM_NULL, #FD_ALL) 
ConnID.l = OpenNetworkConnection(a$,6000)
If ConnID = 0: End: EndIf
AddGadgetItem(3,-1,Name$) 
;Main Loop

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_Gadget
      If EventGadget() = 1
        Text.s = Name$ + Leer$ + GetGadgetText(0)
        SendNetworkData(EventClient(), @Text, Len(Text)+1)
        ClearGadgetItemList(2) 
      EndIf
  EndSelect
  
  Select NetworkServerEvent()
    Case 1
      DisableGadget(1,0)    ; user connected, enable sending.
    Case 4
      DisableGadget(1,1)    ; user disconnected, disable sending.
  EndSelect
   If WaitWindowEvent() = #PB_Event_CloseWindow
    End
  EndIf
If NetworkClientEvent(ConnID) = 2
    Text.s = Space(500)
    ReceiveNetworkData(ConnID, @Text, 500)
    AddGadgetItem(2,-1,Text)  
  EndIf
ForEver



; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

; IDE Options = PureBasic v4.00 (Windows - x86)
; Folding = -

Nur bekomme ich es leider nicht gebacken, einen normalen Clienten zu schreiben, denn wenn ich das mit CreateNetworkServer weglasse, funktioniert es nicht... Könnt ihr mir helfen?

Danke schonmal
FoX
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

`was soll den funzen ?

wenn der Client was schicken soll dann muss es hier nicht heißen:

Code: Alles auswählen

SendNetworkData(EventClient(), @Text, Len(Text)+1)
sondern du musst di ConnectionID nutzen:

Code: Alles auswählen

SendNetworkData(ConnID, @Text, Len(Text)+1)


Desweiteren solltest du nicht zwei mal WaitWindowEvent() in einer schleife haben
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Radiate
Beiträge: 114
Registriert: 10.02.2008 16:40
Kontaktdaten:

Beitrag von Radiate »

Mein Client sieht da sehr spartanisch aus, noch. ;)

Code: Alles auswählen

If InitKeyboard() = 0
  MessageRequester("Synergy-Gaming ComNet » Fehler","Das Netzwerk konnte nicht initialisiert werden! (Fehlercode: KB0504200802)",#PB_MessageRequester_Ok)
EndIf
If InitNetwork() = 0
  MessageRequester("Synergy-Gaming ComNet » Fehler","Die Tastatur konnte nicht initialisiert werden! (Fehlercode: KB0504200803)",#PB_MessageRequester_Ok)
EndIf

Enumeration
  #ComNet_Win
  #ComNet_In
  #ComNet_Out
  #ComNet_Send
  #ComNet_Login
EndEnumeration

; »»»»»»»»»» Fadeout
Procedure close_fadeout(win)
  Protected x, y, w, h, t, winid
  winid = WindowID(win)
  x = WindowX(win)
  y = WindowY(win)
  w = WindowWidth(win)
  h = WindowHeight(win)
  t = 255
  s = 255/15
  SetWindowLong_(winid,#GWL_EXSTYLE,GetWindowLong_(winid,#GWL_EXSTYLE)|#WS_EX_LAYERED)
  LockWindowUpdate_(WindowID(win))
  For i = 1 To 15
    Delay(1)
    ResizeWindow(win, x+w*0.01, y+h*0.01, w*0.99, h*0.99)
    x+w*0.005
    y+h*0.005
    w*0.99
    h*0.99
    t - s
    SetLayeredWindowAttributes_(winid,0,t,2)
  Next
  CloseWindow(win)
EndProcedure

OpenWindow(#ComNet_Win,0,0,600,400,"ComNet Sitzung",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered) And CreateGadgetList(WindowID(#ComNet_Win))
AddKeyboardShortcut(#ComNet_Win,#PB_Shortcut_Return,#ComNet_Send)
EditorGadget(#ComNet_In,10,10,580,240,#PB_Editor_ReadOnly)
ButtonGadget(#ComNet_Login,340,260,120,20,"Login")
ButtonGadget(#ComNet_Send,470,260,120,20,"Senden")
EditorGadget(#ComNet_Out,10,290,580,100)
Repeat
  EventID = WaitWindowEvent()
  If EventID = #PB_Event_CloseWindow
    close_fadeout(#ComNet_Win)
    Break
  EndIf
  Select EventGadget()
    Case #ComNet_Login
      ip$ = InputRequester("Synergy-Gaming ComNet » Login","Server IP eingeben!","")
      ConnectionID = OpenNetworkConnection(ip$, 6654)
      login$ = ip$
      SetGadgetText(#ComNet_In,"Du wurdest mit folgender IP eingeloggt:"+ login$)
    Case #ComNet_Send
        String$ = GetGadgetText(#ComNet_Out)
        SendNetworkString(ConnectionID,String$)
        ;SendNetworkData(ConnectionID, String$,Len(String$))
        AddGadgetItem(#ComNet_In,0,String$)
    Case #PB_Event_CloseWindow
      close_fadeout(#ComNet_Win)
  EndSelect
Until Event = #PB_Event_CloseWindow
close_fadeout(#ComNet_Win)
Ich hoffe du kannst daraus etwas gebrauchen.
Sieht wie ein ICQ oder STEAm oder MSN und Co Client Fenster aus mit oberen und unteren Teil.

Bisher kann man via ENTER und Button(Senden) Nachrichten verschicken.
» PureBasic 4.30
» AMD Athlon II X2 240 | 2048 RAM | Win XP SP 3
» Projekt(e): Fusion (eingestellt), SAS (eingestellt), Moviez
Benutzeravatar
Fox
Beiträge: 75
Registriert: 08.08.2007 10:14
Kontaktdaten:

Beitrag von Fox »

Hi, danke dir Radiate, dein Code hat mir sehr geholfen :)...
Ich bin nun soweit gekommen, das ich ein Clientfenster habe, indem eine Liste, wie in Icq mit Kontakten angezeigt wird, ein Profilfenster, in dem man Benutzderdetail ansehen kann, und ich habe ein Kontaktfenster, in dem man alle User sehen kann, die sich registriert haben, und zu Kontaktliste hinzufügen kann. Mein Problem ist jetzt, das ich nicht weiss, wie ich die Leute in meine Liste hinzufüge, und wenn ich einen Namen (also ein Item) anklicke, soll sich zum Test mal ein MessageRequester öffnen, da ich die Funktion zum Chatten noch ausweiten will...
Hier sind meine bisherigen Codes.

Client.pb

Code: Alles auswählen

If OpenWindow(0, 614, 0, 210, 778, "Chat",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateStatusBar(1, WindowID(0))
      EndIf

      If CreateGadgetList(WindowID(0))
        
        ListIconGadget(2, 0, 0, 210, 670, "Kontaktliste", 100)
        ButtonGadget(3, 10, 680, 190, 30, "Kontakte")
        ButtonGadget(4, 0, 720, 120, 30, "Profil")
        ButtonGadget(5, 130, 720, 80, 30, "Logout")
        StatusBarText(1,2,"Copyright by Martin Hocquel")
        Repeat 
      event=WaitWindowEvent() 
      Select event 
        Case #PB_Event_Gadget 
          Select EventGadget() 
            Case 3  
            
        XIncludeFile "Kontakte.pb"

            Case 4  
            
        XIncludeFile "Profil.pb"

            Case 5  
    End
    
    Repeat 
    Until WaitWindowEvent() = #PB_Event_CloseWindow
          EndSelect 
      EndSelect 
    Until event=#PB_Event_CloseWindow 
  EndIf  
    EndIf

Kontakte.pb

Code: Alles auswählen

a$ = "AlleUser.txt"


  If OpenWindow(20, 266, 9, 600, 468, "Kontakte",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(20))
      ListViewGadget(1, 20, 10, 560, 390)
      ButtonGadget(2, 20, 420, 270, 30, "Hinzufügen")
      ButtonGadget(3, 310, 420, 270, 30, "Details")
      
      If ReadFile(0, a$)  
    While Eof(0) = 0          
      AddGadgetItem(1, -1, ReadString(0))  
    Wend
    CloseFile(0)         
  Else
  EndIf

      
  Repeat 
      event=WaitWindowEvent() 
      Select event 
        Case #PB_Event_Gadget 
          Select EventGadget() 
          
            Case 2
      AddGadgetItem(0, -1, ReadString(0))   
                        
            Case 3
            
            
            
      Repeat 
    Until WaitWindowEvent() = #PB_Event_CloseWindow
          EndSelect 
      EndSelect 
    Until event=#PB_Event_CloseWindow 
  EndIf  
    EndIf

Profil.pb (Funktioniert noch nicht, ist nur Testweise gewesen)

Code: Alles auswählen

  If OpenWindow(10, 216, 0, 193, 242, "Profil",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(10))
      TextGadget(1, 20, 50, 60, 20, "Vorname:")
      TextGadget(2, 20, 10, 40, 20, "Name:")
      TextGadget(3, 20, 90, 80, 20, "Spitzname:")
      TextGadget(4, 20, 130, 60, 20, "Geburtstag:")
      TextGadget(5, 20, 170, 60, 20, "Wohnort:")
      TextGadget(6, 20, 210, 60, 20, "Land:")
          Repeat 
      event=WaitWindowEvent() 
      Select EventGadget() 
      Case #PB_Event_Gadget 
      Repeat 
    Until WaitWindowEvent() = #PB_Event_CloseWindow
          EndSelect 
          Until event=#PB_Event_CloseWindow 
      EndIf
       EndIf
AlleUser.txt (Nur zum Text ;) )

Code: Alles auswählen

Peter
Alfred
Martin
Tobias
Matthias
Philipp
Könnt ihr mir weiterhelfen?

Danke euch schonmal...

Fox
Antworten