Page 1 of 1

using network library of PB

Posted: Thu Apr 05, 2018 8:27 am
by Deraman
Dear, I need nice server and client example for TCP/IP with PB library and event triggered/captured.
Thanks
deraman

Re: using network library of PB

Posted: Thu Apr 05, 2018 8:42 am
by TI-994A
Deraman wrote:I need nice server and client example for TCP/IP with PB library and event triggered/captured...
The PureBasic manual has good examples to start with:

> Network Client
> Network Server

Re: using network library of PB

Posted: Thu Apr 05, 2018 8:51 am
by Deraman
Dear, There is no event handling, to be specific, I need example with
https://www.purebasic.com/documentation ... event.html
Thanks
deraman

Re: using network library of PB

Posted: Thu Apr 05, 2018 9:05 am
by TI-994A
Deraman wrote:Dear, There is no event handling, to be specific, I need example with
https://www.purebasic.com/documentation ... event.html
Thanks
deraman
Please see the linked Network Server example. The function is called in the event loop.

Re: using network library of PB

Posted: Thu Apr 05, 2018 10:49 am
by Deraman
Dear, Thanks! I was only checking client example...please suggest me, I like to listen on specific IP:port...which one I use?
I have to connect ESP-LINK
https://github.com/jeelabs/esp-link

Thanks
deraman

Re: using network library of PB

Posted: Thu Apr 05, 2018 12:14 pm
by Deraman
Dear, I did some codding (from examples), worked but please make it more professional.
Thanks

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   

Re: using network library of PB

Posted: Thu Apr 05, 2018 4:42 pm
by Kiffi
Deraman wrote:Dear, I did some codding (from examples), worked but please make it more professional.
:lol:

Re: using network library of PB

Posted: Thu Apr 05, 2018 8:31 pm
by TI-994A
Here's an example of the client/server routine wrapped into a single application. Two clients, one server, duplex data, quick & dirty.

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
Just to illustrate PureBasic's various network functions. :wink: