Chat (Linked List) Frage
Verfasst: 02.02.2009 17:02
Hallo,
Ich habe einen kleinen Chat geschrieben. Ich poste mal hier den Code, vielleicht habt ihr noch Ideen, was man daran noch verbessern kann. Manchmal klappt da nämlich was nicht.
Server:
Client:
Ich habe einen kleinen Chat geschrieben. Ich poste mal hier den Code, vielleicht habt ihr noch Ideen, was man daran noch verbessern kann. Manchmal klappt da nämlich was nicht.
Server:
Code: Alles auswählen
InitNetwork()
*Buffer = AllocateMemory(1000)
CreateNetworkServer(1, 6705, #PB_Network_TCP)
Structure UserDaten
Nickname.s
EndStructure
Structure UserName
Nickname.s
EndStructure
Structure UserID
ID.l
EndStructure
Global NewList UserName.UserName()
Global NewList UserID.UserID()
Global UserDaten.UserDaten
Global SEvent
Global ClientID
Repeat
SEvent = NetworkServerEvent()
If SEvent
ClientID = EventClient()
Select SEvent
Case 1
AddElement(UserID())
Debug "Connect"
Debug ClientID
UserID()\ID.l = ClientID
Case 2
FreeMemory(*Buffer)
*Buffer = AllocateMemory(1000)
ReceiveNetworkData(ClientID, *Buffer, 1000)
Meldungstext$ = PeekS(*Buffer)
TextInhalt$ = Mid(Meldungstext$, 10, Len(Meldungstext$)-9 )
Meldung$ = PeekS(*Buffer, 8, 0)
If Meldung$ = "Nickname"
AddElement(UserName())
UserName()\Nickname.s = TextInhalt$
ForEach UserID()
SendNetworkString(UserID()\ID.l, "Clearing:test")
Delay(500)
ForEach UserName()
Weiter = 0
SendNetworkString(UserID()\ID.l, "UserUser:"+UserName()\Nickname)
Delay(500)
Next
Next
EndIf
If Meldung$ = "Nachrich"
ForEach UserID()
SendNetworkString(UserID()\ID.l, "Nachrich:"+TextInhalt$)
Next
EndIf
If Meldung$ = "ExitExit"
Ende = ClientID
EndIf
Case 4
ForEach UserID()
NextElement(UserName())
If UserID()\ID = ClientID
DeleteElement(UserID())
DeleteElement(UserName())
EndIf
Next
ForEach UserID()
SendNetworkString(UserID()\ID.l, "Clearing:test")
Delay(500)
ForEach UserName()
Weiter = 0
SendNetworkString(UserID()\ID.l, "UserUser:"+UserName()\Nickname)
Delay(500)
Next
Next
EndSelect
EndIf
Until Quit = 1
Client:
Code: Alles auswählen
Global Nickname$
Structure ServerDaten
User.s
EndStructure
Global ServerDaten.ServerDaten
Global ConnectionID
Down = 0
*Buffer = AllocateMemory(1000)
Procedure Haupt(dumma.l)
If OpenWindow(1, 283, 26, 480, 418, Nickname$, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
EditorGadget(10, 10, 10, 280, 350)
EditorGadget(11, 320, 10, 140, 350)
StringGadget(12, 10, 380, 300, 20, "", 0)
EndIf
Repeat
If GetAsyncKeyState_(#VK_RETURN)
Repeat
Until GetAsyncKeyState_(#VK_RETURN) = 0
NachrText$ = GetGadgetText(12)
SendNetworkString(ConnectionID, "Nachrich:"+NachrText$)
SetGadgetText(12, "")
EndIf
EventID = WaitWindowEvent(1)
Until EventID = #PB_Event_CloseWindow
SendNetworkString(ConnectionID, "ExitExit")
Delay(500)
Down = 1
EndProcedure
Procedure Nickname(dummb.l)
If OpenWindow(0, 383, 268, 292, 97, "New window ( 0 )", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
StringGadget(1, 10, 30, 280, 23, "")
TextGadget(2, 10, 10, 85, 18, "Dein Nickname:")
ButtonGadget(3, 110, 60, 70, 25, "OK", #PB_Button_Default | #PB_Button_Toggle)
EndIf
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_Gadget
Select EventGadget()
Case 3
Nickname$ = GetGadgetText(1)
CloseWindow(0)
Break 1
EndSelect
EndIf
Until EventID = #PB_Event_CloseWindow
EndProcedure
Procedure Connect(dummc.l)
;- Init
Down = 0
*Buffer = AllocateMemory(1000)
InitNetwork()
Repeat
ConnectionID = OpenNetworkConnection("127.0.0.1", 6705)
Until ConnectionID <> 0
SendNetworkString(ConnectionID, "Nickname:"+Nickname$)
Repeat
Delay(300)
ServerID = NetworkClientEvent(ConnectionID)
Select ServerID
Case 2
Meldungstext$ = ""
Meldung$ = ""
TextInhalt$ = ""
FreeMemory(*Buffer)
*Buffer = AllocateMemory(1000)
ReceiveNetworkData(ConnectionID, *Buffer, 1000)
Meldungstext$ = PeekS(*Buffer)
TextInhalt$ = Mid(Meldungstext$, 10, Len(Meldungstext$)-9 )
Meldung$ = PeekS(*Buffer, 8, 0)
If Meldung$ = "UserUser"
ServerDaten\User.s = TextInhalt$
AddGadgetItem(11, 0, ServerDaten\User.s, 0, 0)
EndIf
If Meldung$ = "Clearing"
ClearGadgetItems(11)
EndIf
If Meldung$ = "Nachrich"
AddGadgetItem(10, 0, TextInhalt$, 0, 0)
EndIf
If Down = 1
CloseNetworkConnection(ConnectionID)
Delay(1000)
End
EndIf
EndSelect
Until Quit = 1
EndProcedure
Nickname(dummb.l)
CreateThread(@Connect(), 99)
Haupt(dumma.l)