B4J Question More than one room in WebApp ChatRoom tutorial

Discussion in 'B4J Questions' started by LucaMs, Feb 26, 2019.

  1. LucaMs

    LucaMs Expert Licensed User

    If I'm not mistaken, in the WebApp Chatroom tutorial the chat room is represented by the ChatShared code module.
    If you want to create more than one chat room, it is obviously necessary that this is a class; should the instances of this class be stored in a thread safe map declared and initialized in the Main?

    What "precautions" (mostly related to threads and CallSubDelayed) / modifications would be necessary?

    Thank you
  2. Erel

    Erel Administrator Staff Member Licensed User

    Yes. I think that it is a good design.

    The map keys can be the room identifiers.

    Note that the CallSubDelayed calls are important. Without them the code will be executed on the connection specific thread.
    LucaMs likes this.
  3. LucaMs

    LucaMs Expert Licensed User

    Yes but... is there a thread where the room code is executed? Of course it exists, but which is it?

    Each instance of the websocket handler class (which I consider as a user, a client) has a reference to the room it "belongs to", so the code looks like:
    ' websocket handler class
    Private Room As clsRoom
    Room = [one of the room 
    in the Main.mapRooms]
    An user (websocket handler class) creates (declares and initializes) a new room, when needed, and add it to the Main.mapRooms.
    Other clients will have a reference to that room, using the code above. In which thread will the room code run when called using CallSubDelayed from the clients that have a reference to that room?

    The answer could be: "run a test". The point is that so far, since I had forgotten the difference between Debug and Release in this regard, I always started the server in Debug mode; when, by mistake, I did it in Release, I got very unpleasant results - even (or mainly?) a "Wait For", with the threads, ...! and then I remembered the difference between the two modes :(.

    All very hard to explain using words only :(
    Last edited: Feb 27, 2019
  4. Erel

    Erel Administrator Staff Member Licensed User

    You should initialize the rooms from the main module. This way their code will be executed with the main thread (which is not used too much in server solutions).
    LucaMs likes this.
  5. LucaMs

    LucaMs Expert Licensed User

    "This channel allows us to build web apps where all (or most) of the logic is implemented in the server" [Erel].

    I too would prefer that most of the logic and code were on the server but I thought that by running some of the code in the various threads the server would have had advantages.

    Thanks, Erel.
    Last edited: Feb 27, 2019
  6. Erel

    Erel Administrator Staff Member Licensed User

    This quote has nothing to do with my suggestion. Everything is implemented on the server side.
  7. LucaMs

    LucaMs Expert Licensed User

    It has to do with the set of things to consider in order to decide if clients should be considered stupid data viewers or be them to consider the server as a stupid data provider, in my opinion.

    The main reason why I want all (or almost) logic, code, control to be on the server is the security issue: it is always possible for someone to change a client.

    Obviously it depends on how much processing is necessary to carry out "the task" but I fear that doing everything in the single main thread is too heavy for the server. It is as if the server were a client, with all the logic and, using only data as parameters provided by the clients, it worked as N clients belonging to a group and as M groups at the same time, instead (maybe) being able to exploit multi-threading the server could handle a greater number of clients.
  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