I need a simple asynchronous webserver with websockets.
I could accept asynchronous FTM and convert/add websockets latter.
I have had a quick look at:
1) HTTP Server.
Does not seem to be asynchronous and lacks websockets.
Its not clear if the HTTP server interface supports multiple threads (start/stop aside).
For example I could add worker tasks and have the event handlers push the request object into a queue.
The task may then httpd_resp_send_chunk().
Is this mode supported?
2) ESPAsyncWebserver
ESP-IDF v4.0-dev-562-g2b301f53e will not compile with ardunio 1.0.3-rc1-9-g7d78247
I am aware of https://github.com/espressif/arduino-esp32/issues/1142 but need features of 4.0. Also I am not sure how nice Ardunio will play with the IDF components I need.
3) Kolban's HTTPServer
Not asynchronous & also (unless I am confussed) seems to close the websocket after each request?
Any help/suggestion welcome.
Asynchronous webserver with websockets
Asynchronous webserver with websockets
& I also believe that IDF CAN should be fixed.
Re: Asynchronous webserver with websockets
May I ask why you need it to be asynchronous? Also, in what part of the server do you need it? Do you just need multiple simultaneous connections?
Keep in mind that the wifi & lwip tasks takes up quite a bit of resources, leaving you less than two cores for your own work. If you're thinking you want a a task/thread per client, I suggest you think again. That's how it was done in the old days, but it doesn't scale well.
In the the HTTP(s) server I'm implementing I'm using a single thread to handle all HTTP requests while the actual socket send/receive operations are handled by a separate one (what I call the SocketDispatcher) via event messaging. As such, the HTTP(s) server can process a request while data is being transmitted to/from a client.
If that is asynchronous enough for you, and the GPL-3.0 license is compatible with your use case, have a look at my http_server_test. It's all work in progress (I build what I need for my own use case) and it relies on the Smooth framework. I haven't implemented WebSockets yet and I'm sure there are things that can be improved. Pull Requests are welcome.
Keep in mind that the wifi & lwip tasks takes up quite a bit of resources, leaving you less than two cores for your own work. If you're thinking you want a a task/thread per client, I suggest you think again. That's how it was done in the old days, but it doesn't scale well.
In the the HTTP(s) server I'm implementing I'm using a single thread to handle all HTTP requests while the actual socket send/receive operations are handled by a separate one (what I call the SocketDispatcher) via event messaging. As such, the HTTP(s) server can process a request while data is being transmitted to/from a client.
If that is asynchronous enough for you, and the GPL-3.0 license is compatible with your use case, have a look at my http_server_test. It's all work in progress (I build what I need for my own use case) and it relies on the Smooth framework. I haven't implemented WebSockets yet and I'm sure there are things that can be improved. Pull Requests are welcome.
Re: Asynchronous webserver with websockets
Thanks.
Lets take Kolban's webserver as an example; a connection socket is create with accept(), the request details are obtained from that client socket before being passed to the response handler and processed.
If we are serving a large file then all other HTTP transactions would be stalled until the current request has been completed and/or timed out.
Small and regular AJAX and/or websocket exchanges would have to wait.
I want a scheme where the small data transactions may be given priority.
As I said it would be easy enough to send the request to one of more handler tasks. What I do not know is if the supplied HTTP server code may be used from multiple threads.
Your approach is close to what I want. I would want multiple SocketDispatcher's however and I cannot use GPL.
I want the HTTP engine to handle multiple connections and not to block because of traffic on a connection. There can be a limit to the number of workers of course.May I ask why you need it to be asynchronous?
Lets take Kolban's webserver as an example; a connection socket is create with accept(), the request details are obtained from that client socket before being passed to the response handler and processed.
If we are serving a large file then all other HTTP transactions would be stalled until the current request has been completed and/or timed out.
Small and regular AJAX and/or websocket exchanges would have to wait.
I want a scheme where the small data transactions may be given priority.
As I said it would be easy enough to send the request to one of more handler tasks. What I do not know is if the supplied HTTP server code may be used from multiple threads.
Your approach is close to what I want. I would want multiple SocketDispatcher's however and I cannot use GPL.
& I also believe that IDF CAN should be fixed.
-
- Posts: 45
- Joined: Wed Nov 15, 2017 9:07 pm
Re: Asynchronous webserver with websockets
I would suggest using https://github.com/chmorgan/libesphttpd which is a continuation of Spritetm's libesphttpd. By default it is processing in a FreeRTOS task and can handle multiple connections simultaneously. It is async to the degree that in every cycle polling for data all client sockets are processed one after another. Downloading big files is done by calling the endpoint handler multiple times with additional data so it should not block small requests. I think for most applications this is async enough, only multiple tasks preemting each other could create smaller processing intervals but I doubt it is neccessary.
Re: Asynchronous webserver with websockets
Great. That's async enough for me! End user experience 'real time' not hard!
& I also believe that IDF CAN should be fixed.
Who is online
Users browsing this forum: No registered users and 79 guests