Source code for py1090.connection
import socket
import select
import io
from .message import Message
[docs]class Connection(io.TextIOWrapper):
"""File like object which can be used to read BaseStation messages from a TCP server.
The connection can be used as contextmanager (:keyword:`with`-block) and as iterator: ::
with Connection() as connection:
for line in connection:
print(line)
Args:
host(str): IP or hostname
port(int): Port number
"""
def __init__(self, host="localhost", port=30003):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((host, port))
# have to keep a reference of the wrapper, otherwise it is garbage collected at the end of
# the __init__ function and we will get an error 'I/O operation on closed file'.
self._wrapper = self.socket.makefile('r')
super().__init__(self._wrapper.buffer, encoding=self._wrapper.encoding, errors=self._wrapper.errors)
def __next__(self):
# make this iterator non-blocking for Ctrl+C
while not self.has_data():
pass
return super().__next__()
[docs] def has_data(self):
"""Checks if the socket currently has data available for reading (using :py:func:`select.select`).
Returns:
bool: True if there is data available for reading, False otherwise.
"""
rlist, _, _ = select.select([ self.socket ], [], [], 0)
return len(rlist) > 0
[docs] def readmessage(self):
"""Reads a single line from the connection, parses it via :py:meth:`Message.from_string` and returns it.
Returns:
Message: next unread message from socket
"""
return Message.from_string(self.readline())
def __del__(self):
self.socket.close()