Skip to content

WebSocketServerTransport

class nmeasim::io::WebSocketServerTransport · Library API

Accepts WebSocket clients and sends every line to all of them as a text frame.

#include <nmeasim/io/transports/websocket_server_transport.hpp>

Inherits nmeasim::io::Transport

Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp (line 38)

The server speaks plain ws://, without TLS. A greeting can be configured, as a fixed text or as a function called for each client; it is sent to each client as soon as it connects, before any line. SimulationRunner sets a function that builds the Signal K hello message as the greeting of outputs with the signalk encoding. Clients that disconnect or report a socket error are removed at once, messages received from clients are ignored, and client_count_changed is emitted whenever a client is added or removed. Errors while accepting a connection are reported through error_occurred and leave the server open.

Summary

Public member functions

Name Description
WebSocketServerTransport() Creates a closed server; it starts listening in open.
~WebSocketServerTransport() Destroys the transport, closing it and every client connection first.
description() Returns the bind address and the port.
open() Starts listening on the bind address and port.
close() Closes every client connection, stops listening and moves to State::Closed.
write() Sends line as one text frame to every connected client.
client_count() Returns the number of connected clients.
port() Returns the TCP port of the server.
set_greeting() Sets the text sent to every client immediately after it connects.
set_greeting_function() Sets a function that builds the greeting of each client when it connects.
greeting() Returns the greeting a client connecting now would receive.

Private member functions

Name Description
accept_connections() Takes every pending connection from the server, starts tracking it, sends it the greeting and emits client_count_changed.
drop_client() Stops tracking client, schedules its deletion and emits client_count_changed.

Private data members

Name Description
server_ The listening server, in non-secure mode, identifying itself as NMEA Simulator X during the handshake.
clients_ Connected clients, in order of connection; deleted with deleteLater when removed.
requested_port_ Port passed to the constructor; 0 for a port chosen by the operating system.
bind_address_ Local address to listen on.
greeting_ Text sent to each client on connection; empty for none, or when greeting_function_ is set.
greeting_function_ Builds the greeting of each client on connection; empty to use greeting_ instead.

Public member functions

WebSocketServerTransport()

explicit WebSocketServerTransport(
    quint16 port,
    QHostAddress bind_address = QHostAddress::Any,
    QObject* parent = nullptr)

Creates a closed server; it starts listening in open.

Parameters

Name Type Description
port quint16 TCP port to listen on; 0 asks the operating system for a free port, which port returns once the server is open.
bind_address QHostAddress Local address to listen on. The default QHostAddress::Any accepts connections on every interface, IPv4 and IPv6; QHostAddress::LocalHost accepts local connections only.
parent QObject* Qt parent that owns the transport; null leaves ownership to the caller.

Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:50 · defined in src/io/src/transports/websocket_server_transport.cpp:12

~WebSocketServerTransport()

~WebSocketServerTransport() override

Destroys the transport, closing it and every client connection first.

Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:53 · defined in src/io/src/transports/websocket_server_transport.cpp:24

description()

QString description() const override

Returns the bind address and the port.

Returns QString: For example WebSocket server on 127.0.0.1:3000, with the port actually listened on while open.

Overrides description · Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:59 · defined in src/io/src/transports/websocket_server_transport.cpp:28

open()

bool open() override

Starts listening on the bind address and port.

Returns true at once when already open. Fails with Cannot listen on <address>:<port> and the reason, for example when the port is already in use.

Returns bool: True when the server listens, false when listening failed.

Overrides open · Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:66 · defined in src/io/src/transports/websocket_server_transport.cpp:32

close()

void close() override

Closes every client connection, stops listening and moves to State::Closed.

Emits client_count_changed with 0, even when no client was connected.

Overrides close · Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:70 · defined in src/io/src/transports/websocket_server_transport.cpp:48

write()

void write(const QByteArray& line) override

Sends line as one text frame to every connected client.

The line is decoded as UTF-8 and sent with its terminator. Does nothing when no client is connected.

Parameters

Name Type Description
line const QByteArray& One complete line or message, terminator included, encoded in UTF-8.

Overrides write · Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:77 · defined in src/io/src/transports/websocket_server_transport.cpp:63

client_count()

int client_count() const override

Returns the number of connected clients.

Returns int: The clients accepted and not yet removed; 0 while closed.

Overrides client_count · Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:81 · defined in src/io/src/transports/websocket_server_transport.cpp:75

port()

quint16 port() const

Returns the TCP port of the server.

Returns quint16: The port actually listened on while open, which is the one chosen by the operating system when 0 was requested; otherwise the requested port.

Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:87 · defined in src/io/src/transports/websocket_server_transport.cpp:79

set_greeting()

void set_greeting(QString greeting)

Sets the text sent to every client immediately after it connects.

Applies to clients that connect afterwards; clients already connected do not receive it. Replaces a function set by set_greeting_function.

Parameters

Name Type Description
greeting QString The greeting, sent as one text frame; empty disables it.

Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:95

set_greeting_function()

void set_greeting_function(std::function<QString()> greeting)

Sets a function that builds the greeting of each client when it connects.

The function is called once per client, on the transport's thread, just before the greeting is sent, so that a greeting carrying a time or a state is current. Applies to clients that connect afterwards and replaces a text set by set_greeting.

Parameters

Name Type Description
greeting std::function<QString()> Returns the greeting, sent as one text frame; an empty result sends none. An empty function disables the greeting.

Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:107

greeting()

QString greeting() const

Returns the greeting a client connecting now would receive.

Returns QString: The result of the function set by set_greeting_function when one is set, otherwise the text set by set_greeting; empty when neither is set.

Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:115

Private member functions

accept_connections()

void accept_connections()

Takes every pending connection from the server, starts tracking it, sends it the greeting and emits client_count_changed.

Connected to QWebSocketServer::newConnection.

Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:123 · defined in src/io/src/transports/websocket_server_transport.cpp:83

drop_client()

void drop_client(QWebSocket* client)

Stops tracking client, schedules its deletion and emits client_count_changed.

Connected to the disconnected and errorOccurred signals of every client; a client that is no longer tracked is ignored, so a client reporting both is removed once.

Parameters

Name Type Description
client QWebSocket* The client socket to remove.

Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:130 · defined in src/io/src/transports/websocket_server_transport.cpp:96

Private data members

server_

QWebSocketServer server_

The listening server, in non-secure mode, identifying itself as NMEA Simulator X during the handshake.

Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:134

clients_

QList<QWebSocket *> clients_

Connected clients, in order of connection; deleted with deleteLater when removed.

Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:136

requested_port_

quint16 requested_port_

Port passed to the constructor; 0 for a port chosen by the operating system.

Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:138

bind_address_

QHostAddress bind_address_

Local address to listen on.

Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:140

greeting_

QString greeting_

Text sent to each client on connection; empty for none, or when greeting_function_ is set.

Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:143

greeting_function_

std::function<QString()> greeting_function_

Builds the greeting of each client on connection; empty to use greeting_ instead.

Declared in src/io/include/nmeasim/io/transports/websocket_server_transport.hpp:145

Inherited members

From nmeasim::io::WebSocketServerTransport: bytes_written(), client_count_changed(), count_bytes(), error_occurred(), fail(), is_open(), last_error(), set_state(), State, state(), state_changed(), Transport()