From 02d676bda89c2fb8469ea81f7429c19c1e29df7c Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Sat, 15 Jul 2023 14:44:41 +0200 Subject: Initial commit --- socket_conn.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100755 socket_conn.py (limited to 'socket_conn.py') diff --git a/socket_conn.py b/socket_conn.py new file mode 100755 index 0000000..0ac7230 --- /dev/null +++ b/socket_conn.py @@ -0,0 +1,46 @@ +# +# Describe a connection over a socket. +# +# This class is intended to be apdapted into IEndpoint interface + +import socket +from zope import interface +import errno + +from interfaces import endpoint + +from zope import component +from interfaces.message import Debug + +@interface.implementer(endpoint.IConnection) +class SocketConnection(object): + """ Define a connected element (serial, network…) + """ + + def __init__(self, configuration): + self.port = int(configuration["port"]) + self.host = configuration["host"] + + def connect(self) -> None: + """ Connect """ + self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.s.connect((self.host, self.port)) + self.s.settimeout(0.0) + component.handle(Debug("Connected to the socket")) + + def read(self) -> str: + """ Read from the connection and return the bytes. + Return None if there is nothing to read (non-blocking) + Raise an exception if disconnected """ + try: + return self.s.recv(1024) + except socket.error as e: + err = e.args[0] + if err == errno.EAGAIN or err == errno.EWOULDBLOCK: + return None + raise e + + def write(self, content:str) -> None: + """ Write into the connection. + Raise an exception if disconnected """ + self.s.sendall(content) -- cgit v1.2.3