B4J Question [RESOLVED]WebSockets Help

Discussion in 'B4J Questions' started by Jmu5667, Feb 25, 2015.

  1. Jmu5667

    Jmu5667 Well-Known Member Licensed User

    Hi All

    I am trying to develop a jserver app that will accept web socket connections. My understanding is that jserver is HTTP based. I do not what to use the HTTP aspect of this as I want to send and received data from the clients in a raw format as this is not a web app with HTMl pages etc.

    Why do I want to do this ? Most of the apps we have are VB6 winsock base apps. So, we need to use the multi-threading aspect of jserver to provide a more robust solution for our customers and not be limited to running all socket connects on the main thread.

    I have very little experience with HTTP servers etc so please forgive my ignorance on this topic.

    This is the jserver setup

    Code:
    Sub initialise_host

       CallSubDelayed2(mod_app_functions,
    "writelog","initialise_host(), not Initialized")
       
       
    ' // initialise the server host
       Try
         svrHost.Initialize(
    "host")
         svrHost.Port = appSet.svr.port
         svrHost.StaticFilesFolder = appSet.settingsLocation
         
    ' // root folder
         svrHost.AddWebSocket("/ws","class_websocket")
         svrHost.Start
         appSet.svr.started = 
    True
         CallSubDelayed2(mod_app_functions,
    "writelog","initialise_host(), server started")
       
    Catch
         appSet.svr.started = 
    False
         CallSubDelayed2(mod_app_functions,
    "writelog","initialise_host(), error - " & LastException.Message )
       
    End Try

    End Sub
    The /ws is an empty folder on the root drive (windows 7).

    This is the class_websocket

    Code:
    'WebSocket class
    Sub Class_Globals
       
       
    Private ws As WebSocket
       
    End Sub

    Public Sub Initialize
       
       CallSubDelayed2(mod_app_functions,
    "writelog","WebSocket_Initialized()")
       
    End Sub

    Private Sub WebSocket_Connected (WebSocket1 As WebSocket)

       ws = WebSocket1
       
       CallSubDelayed2(mod_app_functions,
    "writelog","WebSocket_Connected()")

    End Sub

    Private Sub WebSocket_Disconnected

       CallSubDelayed2(mod_app_functions,
    "writelog","WebSocket_Disconnected()")

    End Sub

    Using a Vb6 winsock test app or HyperTerminal I can connect to the server but the class_socket does not seem to get executed.

    Once I have a connection established I would like know to to send and receive data on each web-socket thread.

    I would be very grateful with any assistance on this topic. Once I have this solved I would be quite happy to publish a basic template project to help others who want to achieve the same.

    Regards

    John.
     
  2. wl

    wl Well-Known Member Licensed User

    I guess you need to Base64 encode the binary data.

    Raw sockets would be a better choice, but you are correct that raw sockets do not work multi-threaded in B4J
     
  3. Jmu5667

    Jmu5667 Well-Known Member Licensed User

    Hi wl

    That maybe the case alright, however I cant get the class_websocket to fire when a connetion is made .... I need to get all the comms working first before I can send and receive data.

    Have you built a jserver app with the websocket class ?

    Regards

    John.
     
  4. wl

    wl Well-Known Member Licensed User

    Hi John,

    I indeed wrote a websocket app. Although the info is a bit scattered throughout the B4 and B4J forums my main info was the websocket chat app.
     
  5. Jmu5667

    Jmu5667 Well-Known Member Licensed User

    I have looked at that alright. I have a very simple test app, init the jserver and add websocket but when the connection is made the web socket class is never called ?
     
  6. Jmu5667

    Jmu5667 Well-Known Member Licensed User

    when the server starts this is the log data

    2015-02-25 13:33:05.367:INFO::main: Logging initialized @155ms
    2015-02-25 13:33:05.520:INFO:eek:ejs.Server:main: jetty-9.1.z-SNAPSHOT
    2015-02-25 13:33:05.572:WARN:eek:ejh.MimeTypes:main: java.util.MissingResourceException: Can't find bundle for base name org/eclipse/jetty/http/encoding, locale en_IE
    2015-02-25 13:33:05.611:INFO:eek:ejsh.ContextHandler:main: Started o.e.j.s.ServletContextHandler@1016012{/,file:/C:/Users/John%20Murphy/Desktop/Documents/B4J/test%20jserver/Objects/www,AVAILABLE}
    2015-02-25 13:33:05.616:INFO:eek:ejs.AbstractNCSARequestLog:main: Opened C:\Users\John Murphy\Desktop\Documents\B4J\test jserver\Objects\logs\b4j-2015_02_25.request.log
    2015-02-25 13:33:06.724:INFO:eek:ejs.ServerConnector:main: Started ServerConnector@29cab9{HTTP/1.1}{0.0.0.0:8087}
    2015-02-25 13:33:06.724:INFO:eek:ejs.Server:main: Started @1646ms

    My ip address seems to be {0.0.0.0:8087}, even though it is 192.168.137.1
     
  7. Erel

    Erel Administrator Staff Member Licensed User

    WebSockets will only work with a web socket client.

    Can you send http requests from the VB6 apps?

    Note that if you are using AsyncStreams with regular sockets then the communication is already handled in the background for you. You do not need to create more threads.
    This is not scalable as a solution based on jServer, however if you do not have full control over the client then you may have no other choice.
     
  8. Jmu5667

    Jmu5667 Well-Known Member Licensed User

    Hi Erel

    thanks for the heads up. The B4A app currently use the standard SOCKET, I will upgrade it to use websockets and start from there. As long as I can send and received any type of data from the client to the server that's good enough for me.

    It should not be too difficult to do this...fingers crossed !

    Regards

    John.
     
  9. Erel

    Erel Administrator Staff Member Licensed User

    I'm not sure that you should use WebSockets instead of standard servlet handlers.

    Do you need to maintain a persistent connection? Or the clients send some data each time and receive the server response?
     
  10. Jmu5667

    Jmu5667 Well-Known Member Licensed User

    I need to maintain a persistent connection, data can be sent and received at anytime.
     
  11. Erel

    Erel Administrator Staff Member Licensed User

    Then you need WebSockets. However your VB6 apps probably cannot implement a web socket client.
     
  12. Jmu5667

    Jmu5667 Well-Known Member Licensed User

    The plan is to ditch all the legacy vb6 apps and redevelop in B4J/B4A/B4I
     
    Erel likes this.
  13. Erel

    Erel Administrator Staff Member Licensed User

    Jmu5667 likes this.
  14. Jmu5667

    Jmu5667 Well-Known Member Licensed User

  15. Jmu5667

    Jmu5667 Well-Known Member Licensed User

    SORTED !!!!!! Thanks for all the pointers ;)
     
    Erel likes this.
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice