TcpClient

class lsst.ts.m2com.TcpClient(host: str, port: int, callback_process_message: Callable[[...], Coroutine], *args: Any, log: Logger | None = None, sequence_generator: Generator | None = None, name: str = 'tcp-client', check_message_rate: bool = False)

Bases: Client

TCP/IP client.

Parameters

hoststr

Host address.

portint

Port to connect.

callback_process_messagecoroutine

Function to process the received message. It must has a keyward argument of “message” to receive the message as a dictionary.

*argsargs

Arguments needed in “callback_process_message” function call.

loglogging.Logger or None, optional

A logger. If None, a logger will be instantiated. (the default is None)

sequence_generatorgenerator or None, optional

Sequence generator. (the default is None)

namestr, optional

Name of the tcp-client. Used for logging/debugging purposes. The default is “tcp-client”)

check_message_ratebool, optional

Check the message rate or not. If True, the rate of message will be calculated and recorded in the debug logging message. (the default is False)

Attributes

loglogging.Logger

A logger.

timeoutfloat

Read timeout in second.

last_sequence_idint

Last sequence ID of command.

Attributes Summary

connected

Return True if self._reader and self._writer are connected.

Methods Summary

basic_close()

Close the connected client socket, if any, and set done_task done.

call_connect_callback()

Call self.__connect_callback.

close()

Cancel the task and close the connection.

connect([timeout])

Connect to the server.

read(n)

Read up to n bytes.

read_into(struct)

Read binary data from a stream reader into a ctypes.Structure.

read_json()

Read JSON data.

read_str()

Read and decode a terminated str; strip the terminator.

readexactly(n)

Read exactly n bytes.

readline()

Read a sequence of bytes ending with \n.

readuntil([separator])

Read one line, where “line” is a sequence of bytes ending with separator.

start(**kwargs)

Connect to the TCP/IP server.

write(data)

Write data and call drain.

write_from(*structs)

Write binary data from one or more ctypes.Structures.

write_json(data)

Write data in JSON format.

write_message(msg_type, msg_name[, ...])

Writes message to the server.

write_str(line)

Encode, terminate, and write a str.

writelines(lines)

Write an iterable of bytes and call drain.

Attributes Documentation

connected

Return True if self._reader and self._writer are connected.

Note: if the other end drops the connection and if you are not trying to read data (e.g. in a background loop), then it takes the operating system awhile to realize the connection is lost. So this can return true for some unknown time after the connection has been dropped.

Methods Documentation

async basic_close() None

Close the connected client socket, if any, and set done_task done.

Like close except does not clear self.should_be_connected, nor cancel self._monitor_connection_task.

async call_connect_callback() None

Call self.__connect_callback.

This is always safe to call. It only calls the callback function if that function is not None and if the connection state has changed since the last time this method was called.

async close() None

Cancel the task and close the connection.

Note: this function is safe to call even though there is no connection.

async connect(timeout: float = 10.0) None

Connect to the server.

Parameters

timeoutfloat, optional

Timeout in second. (default is 10.0)

async read(n: int) bytes

Read up to n bytes.

Parameters

nint

The number of bytes to read. If -1 then block until the other end closes its writer, then return all data seen.

Raises

ConnectionError

If the connection is lost before, or while, reading.

async read_into(struct: Structure) None

Read binary data from a stream reader into a ctypes.Structure.

Parameters

structctypes.Structure

Structure to set.

Raises

ConnectionError

If the connection is lost before, or while, reading.

asyncio.IncompleteReadError

If EOF is reached before n bytes can be read. Use the IncompleteReadError.partial attribute to get the partially read data.

async read_json() Any

Read JSON data.

Read the data with read_str and return the json-decoded result.

Returns

datatyping.Any

Data decoded from JSON.

Raises

ConnectionError

If the connection is lost before, or while, reading.

asyncio.IncompleteReadError

If EOF is reached before the complete separator is found and the internal buffer is reset.

LimitOverrunError

If the amount of data read exceeds the configured stream lmit. The data is left in the internal buffer and can be read again.

TypeError

If the data are of a type that cannot be decoded from JSON.

json.JSONDecodeError

If the data cannot be decoded from JSON.

async read_str() str

Read and decode a terminated str; strip the terminator.

Read until self.terminator, strip the terminator, and decode the data as self.encoding with strict error handling.

Returns

linestr

Line of data, as a str with the terminator stripped.

Raises

ConnectionError

If the connection is lost before, or while, reading.

asyncio.IncompleteReadError

If EOF is reached before the complete separator is found and the internal buffer is reset.

LimitOverrunError

If the amount of data read exceeds the configured stream lmit. The data is left in the internal buffer and can be read again.

UnicodeError

If decoding fails.

async readexactly(n: int) bytes

Read exactly n bytes.

Parameters

nint

The number of bytes to read.

Raises

ConnectionError

If the connection is lost before, or while, reading.

asyncio.IncompleteReadError

If EOF is reached before n bytes can be read. Use the IncompleteReadError.partial attribute to get the partially read data.

async readline() bytes

Read a sequence of bytes ending with \n.

If EOF is received and \n was not found, the method returns partially read data.

Raises

ConnectionError

If the connection is lost before, or while, reading.

async readuntil(separator: bytes = b'\n') bytes

Read one line, where “line” is a sequence of bytes ending with separator.

Read data from the stream until separator is found.

On success, the data and separator will be removed from the internal buffer (consumed). Returned data will include the separator at the end.

See also read_str, which is more convenient for most use cases.

Parameters

separatorbytes

The desired separator. The default matches the standard library, rather than using terminator.

Raises

ConnectionError

If the connection is lost before, or while, reading.

asyncio.IncompleteReadError

If EOF is reached before the complete separator is found and the internal buffer is reset.

LimitOverrunError

If the amount of data read exceeds the configured stream lmit. The data is left in the internal buffer and can be read again.

async start(**kwargs: Any) None

Connect to the TCP/IP server.

This is called automatically by the constructor, and is not intended to be called by the user. It is a public method so that subclasses can override it.

Parameters

**kwargsdict [str, typing.Any]

Additional keyword arguments for asyncio.open_connection, beyond host and port.

Raises

RuntimeError

If start already called.

async write(data: bytes) None

Write data and call drain.

Parameters

databytes

The data to write.

Raises

ConnectionError

If self.connected false before writing begins.

async write_from(*structs: Structure) None

Write binary data from one or more ctypes.Structures.

Parameters

structslist [ctypes.Structure]

Structures to write.

Raises

ConnectionError

If self.connected false before writing begins.

async write_json(data: Any) None

Write data in JSON format.

Encode the data as json and write the result with write_str.

Parameters

dataany

The data to be written. Typically a dict, but any json-encodable data is acceptable.

Raises

ConnectionError

If the connection is lost before, or while, reading.

UnicodeError

If encoding fails.

json.JSONEncodeError

If the data cannot be json-encoded.

async write_message(msg_type: MsgType, msg_name: str, msg_details: dict | None = None, comp_name: str | None = None) None

Writes message to the server.

Parameters

msg_typeenum MsgType

Message type.

msg_namestr

Message name.

msg_detailsdict or None, optional

Message details. (the default is None)

comp_namestr or None, optional

Specific component name used in the event or telemetry. (the default is None)

Raises

RuntimeError

When there is no TCP/IP connection.

ValueError

If ‘id’ is in the message details already.

ValueError

When the message type is not supported.

async write_str(line: str) None

Encode, terminate, and write a str.

Encode the str as self.encoding with strict error handling, and append self.terminator.

Parameters

linestr

The line of data to be written.

Raises

ConnectionError

If the connection is lost before, or while, reading.

UnicodeError

If encoding fails.

async writelines(lines: Iterable) None

Write an iterable of bytes and call drain.

Parameters

linescollections.abc.Iterable [bytes]

The data to write, as an iterable collection of bytes.

Raises

ConnectionError

If self.connected false before writing begins.