using network library of PB
Posted: Thu Apr 05, 2018 8:27 am
Dear, I need nice server and client example for TCP/IP with PB library and event triggered/captured.
Thanks
deraman
Thanks
deraman
http://www.purebasic.com
https://www.purebasic.fr/english/
The PureBasic manual has good examples to start with:Deraman wrote:I need nice server and client example for TCP/IP with PB library and event triggered/captured...
Please see the linked Network Server example. The function is called in the event loop.Deraman wrote:Dear, There is no event handling, to be specific, I need example with
https://www.purebasic.com/documentation ... event.html
Thanks
deraman
Code: Select all
;NewMap RecData.s()
OpenWindow(0, 100, 200, 200, 100, "Echo Server", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget )
If InitNetwork() = 0
MessageRequester("Error", "Can't initialize the network !", 0)
End
EndIf
Port = 23
NewMap RecData.s()
ConnectionID = OpenNetworkConnection("192.168.8.100", Port)
If ConnectionID
MessageRequester("PureBasic - Client", "Client connected to server...", 0)
SendNetworkString(ConnectionID, "An hello from a client !!! :-)", #PB_UTF8)
MessageRequester("PureBasic - Client", "A string has been sent to the server, please check it before quit...", 0)
; CloseNetworkConnection(ConnectionID)
Else
MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf
Repeat
Event = NetworkClientEvent(ConnectionID)
If Event = #PB_NetworkEvent_Data
*Buffer = AllocateMemory(20000)
count = ReceiveNetworkData(ConnectionID, *Buffer, 20000)
; For i = 1 To count
; RecData(Str(ConnectionID)) + Mid( PeekS(*Buffer, count), i , 1)
; If Right( RecData(Str(ConnectionID)), 2) = #CRLF$
; SendNetworkString (ClientID, RecData(Str(ClientID)))
Debug RecData(Str(ConnectionID))
; RecData(Str(ConnectionID)) = ""
; EndIf
; Next
Debug PeekS(*Buffer, -1, #PB_UTF8)
FreeMemory(*Buffer)
EndIf
Event = WaitWindowEvent(10)
Until Event = #PB_Event_CloseWindow
End
Deraman wrote:Dear, I did some codding (from examples), worked but please make it more professional.
Code: Select all
Enumeration #PB_Event_FirstCustomValue
#serverInitialised
#serverBroadcast
EndEnumeration
Global serverDisplay, startServer, stopServer, serverThreadQuit, port = 6832,
client1Display, client1Message, client1ID, send1, receive1, connect1,
client2Display, client2Message, client2ID, send2, receive2, connect2,
clientDisplay, clientMessage, clientID, connect
Procedure initClient(output)
connectionID = OpenNetworkConnection("127.0.0.1", port)
If connectionID
AddGadgetItem(output, 0, "connected to server.")
Else
AddGadgetItem(output, 0, "server not found.")
EndIf
ProcedureReturn connectionID
EndProcedure
Procedure initServer(server)
If CreateNetworkServer(0, port)
AddGadgetItem(server, 0, "Server created (Port " + Str(port) + ").")
PostEvent(#serverInitialised)
serverOutput = GetGadgetData(server)
Repeat
serverEvent = NetworkServerEvent()
If serverEvent
client = EventClient()
Select serverEvent
Case #PB_NetworkEvent_Connect
AddGadgetItem(server, 0, "a new client has connected (" + Str(client) + ").")
Case #PB_NetworkEvent_Data
*Buffer = AllocateMemory(1000)
ReceiveNetworkData(client, *Buffer, 1000)
clientMessage$ = PeekS(*Buffer, -1, #PB_UTF8)
FreeMemory(*Buffer)
If clientMessage$ = "poll"
SendNetworkString(client, GetGadgetText(serverOutput), #PB_UTF8)
PostEvent(#serverBroadcast)
Else
AddGadgetItem(server, 0, "client " + Str(client) + ": " + clientMessage$)
EndIf
Case #PB_NetworkEvent_Disconnect
AddGadgetItem(server, 0, "client " + Str(client) + " has disconnected.")
EndSelect
EndIf
Until serverThreadQuit
CloseNetworkServer(0)
AddGadgetItem(server, 0, "Server stopped.")
Else
MessageRequester("Server Error", "Unable to initialise server.", 0)
EndIf
EndProcedure
Procedure initWindow(x = 0, y = 0, width = 600, height = 400)
OpenWindow(#PB_Any, x, y, width, height, "Client/Server Example",
#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
FrameGadget(#PB_Any, 310, 20, 270, 360, "Server")
serverMessage = StringGadget(#PB_Any, 320, 40, 250, 25, "")
serverDisplay = ListViewGadget(#PB_Any, 320, 75, 250, 255)
startServer = ButtonGadget(#PB_Any, 330, 340, 110, 25, "START SERVER")
stopServer = ButtonGadget(#PB_Any, 450, 340, 110, 25, "STOP SERVER")
SetGadgetColor(serverMessage, #PB_Gadget_BackColor, RGB(200, 255, 255))
SetGadgetData(serverDisplay, serverMessage)
FrameGadget(#PB_Any, 20, 20, 200, 170, "Client 1")
client1Message = StringGadget(#PB_Any, 30, 40, 180, 25, "")
client1Display = ListViewGadget(#PB_Any, 30, 75, 180, 105)
send1 = ButtonGadget(#PB_Any, 270, 40, 30, 25, ">>>")
receive1 = ButtonGadget(#PB_Any, 230, 40, 30, 25, "<<<")
connect1 = ButtonGadget(#PB_Any, 230, 70, 70, 25, "< X >")
SetGadgetColor(client1Message, #PB_Gadget_BackColor, RGB(200, 255, 230))
FrameGadget(#PB_Any, 20, 210, 200, 170, "Client 2")
client2Message = StringGadget(#PB_Any, 30, 230, 180, 25, "")
client2Display = ListViewGadget(#PB_Any, 30, 265, 180, 105)
send2 = ButtonGadget(#PB_Any, 270, 230, 30, 25, ">>>")
receive2 = ButtonGadget(#PB_Any, 230, 230, 30, 25, "<<<")
connect2 = ButtonGadget(#PB_Any, 230, 260, 70, 25, "< X >")
SetGadgetColor(client2Message, #PB_Gadget_BackColor, RGB(200, 255, 230))
SetActiveGadget(client1Message)
EndProcedure
Procedure populateCurrentVars(gadget)
If gadget = send1 Or gadget = receive1 Or gadget = connect1
clientDisplay = client1Display
clientMessage = client1Message
clientID = client1ID
connect = connect1
Else
clientDisplay = client2Display
clientMessage = client2Message
clientID = client2ID
connect = connect2
EndIf
EndProcedure
If InitNetwork()
initWindow()
serverThread = CreateThread(@initServer(), serverDisplay)
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_CloseWindow
appQuit = 1
Case #PB_Event_Gadget
populateCurrentVars(EventGadget())
Select EventGadget()
Case send1, send2
If clientID <> 0
SendNetworkString(clientID, Trim(GetGadgetText(clientMessage)), #PB_UTF8)
EndIf
Case receive1, receive2
If clientID <> 0
currentClient = clientID
SendNetworkString(clientID, "poll", #PB_UTF8)
EndIf
Case connect1, connect2
If clientID = 0
clientID = initClient(clientDisplay)
SetGadgetText(connect, "< X >")
Else
CloseNetworkConnection(clientID)
SetGadgetText(connect, "< = >")
AddGadgetItem(clientDisplay, 0, "disconnected from server.")
clientID = 0
EndIf
If EventGadget() = connect1
client1ID = clientID
Else
client2ID = clientID
EndIf
Case startServer
If IsThread(serverThread) = 0
serverThreadQuit = 0
serverThread = CreateThread(@initServer(), serverDisplay)
Else
AddGadgetItem(server, 0, "<server running>")
EndIf
Case stopServer
If IsThread(serverThread) <> 0
serverThreadQuit = 1
Else
AddGadgetItem(server, 0, "<server not running>")
EndIf
EndSelect
Case #serverBroadcast
CEvent = NetworkClientEvent(currentClient)
If CEvent And CEvent = #PB_NetworkEvent_Data
*Buffer = AllocateMemory(1000)
ReceiveNetworkData(currentClient, *Buffer, 1000)
If currentClient = client1ID
clientDisplay = client1Display
Else
clientDisplay = client2Display
EndIf
AddGadgetItem(clientDisplay, 0, "server: " + PeekS(*Buffer, -1, #PB_UTF8))
FreeMemory(*Buffer)
EndIf
Case #serverInitialised
client1ID = initClient(client1Display)
client2ID = initClient(client2Display)
EndSelect
Until appQuit
Else
MessageRequester("Network Error", "Unable to initialise network.", 0)
EndIf