Typical WebSocket server application in userver consists of the following parts:
WebSocket handler component - main logic of your application
Static config - startup config that does not change for the whole lifetime of an application
int main() - startup code
Let's write a simple chat server that echoes incoming messages as outgoing messages for any websocket connected to /chat URL.
WebSocket handler component
WebSocket handlers must derive from server::websocket::WebsocketHandlerBase and have a name, that is obtainable at compile time via kName variable and is obtainable at runtime via HandlerName().
Now we have to configure the service by providing task_processors and default_task_processor options for the components::ManagerControllerComponent and configuring each component in components section:
# yaml
components_manager:
task_processors: # Task processor is an executor for coroutine tasks
main-task-processor: # Make a task processor for CPU-bound coroutine tasks.
worker_threads: 4 # Process tasks in 4 threads.
fs-task-processor: # Make a separate task processor for filesystem bound tasks.
worker_threads: 4
default_task_processor: main-task-processor # Task processor in which components start.
components: # Configuring components that were registered via component_list
server:
listener: # configuring the main listening socket...
port: 8080 # ...to listen on this port and...
task_processor: main-task-processor # ...process incoming requests on this task processor.
logging:
fs-task-processor: fs-task-processor
loggers:
default:
file_path: '@stderr'
level: debug
overflow_behavior: discard # Drop logs if the system is too busy to write them down.
To build the sample, execute the following build steps at the userver root directory:
mkdir build_release
cd build_release
cmake -DCMAKE_BUILD_TYPE=Release ..
make userver-samples-websocket_service
The sample could be started by running make start-userver-samples-websocket_service. The command would invoke testsuite start target that sets proper paths in the configuration files and starts the service.
To start the service manually run ./samples/websocket_service/userver-samples-websocket_service -c </path/to/static_config.yaml>.
Note
CMake doesn't copy static_config.yaml file from samples directory into build directory.
Now you can send messages to your server from another terminal: