Skip to content

alternate class, inspired by your work #4

@amarco

Description

@amarco

I created the class below, it essential does the same thing but it is bidirectional and I pass dictinaries back and forth which can contain numpy arrays, strings ect. Do with as you may.

import socket
import pickle
import struct
import logging

class SocketDataTransfer():
def init(self):
logging.info("Instantiating object")
self.address = ''
self.port = 0
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.type = None
self.data =b''

def initialize(self,address,port,mode,buffSize=16):
    """
    :initialize
    :param address: host address of the socket e.g 'localhost' or your ip
    :type address: str
    :param port: port in which the socket should be intialized. e.g 4000
    :type port: int
    :param mode: instatntiate mode of operation [ client | server ]
    :type mode: str
    :return: None
    :rtype: None
    """
    self.address = address
    self.port = port
    self.mode = mode.lower()
    self.buffSize = buffSize
    self.payload_size = struct.calcsize("!Q")  
    logging.info("Attempting to Initializing mode: {0}".format(self.mode))
    if self.mode == "client":
        self.initialize_sender()
    elif self.mode == "server":
        self.initalize_receiver()

def initialize_sender(self):
    """
    :acts as client
    :param address: host address of the socket e.g 'localhost' or your ip
    :type address: str
    :param port: port in which the socket should be intialized. e.g 4000
    :type port: int
    :return: None
    :rtype: None
    """
    logging.info("Initializing client mode connection to:{0}:{1}".format(self.address, self.port))
    self.socket.connect((self.address, self.port))
    logging.info("..client mode complete")

def initalize_receiver(self):
    """
    :acts as server
    :param port: port to listen
    :type port: int
    :return: numpy array
    :rtype: ndarray
    """
    logging.info("Initializing server mode")
    self.socket.bind((self.address, self.port))
    logging.info("..waiting for connection")
    self.socket.listen(10)
    self.conn, addr = self.socket.accept()
    logging.info("..incoming connection from: {0}:{1}".format(addr,self.port))
    

def send_data(self, data):
    """
    :param np_array: Numpy array to send to the listening socket
    :type np_array: ndarray
    :return: None
    :rtype: None
    """
    if self.mode == "client":
        conn = self.socket
    elif self.mode == "server":
        conn = self.conn

    _data = pickle.dumps(data)
    message_size = struct.pack("!Q", len(_data))  
    conn.sendall(message_size + _data)

def receive_data(self):

    if self.mode == "client":
        conn = self.socket
    elif self.mode == "server":
        conn = self.conn

    while len(self.data) < self.payload_size:
        packet = conn.recv(self.buffSize)
        if not packet: break
        self.data += packet
        
    packed_msg_size = self.data[:self.payload_size]
    self.data = self.data[self.payload_size:]
    msg_size = struct.unpack("!Q", packed_msg_size)[0]

    # Retrieve all data based on message size
    while len(self.data) < msg_size:
        packet = conn.recv(self.buffSize)
        if not packet: break
        self.data += packet

    frame_data = self.data[:msg_size]
    self.data = self.data[msg_size:]

    # Extract frame
    _data = pickle.loads(frame_data)
    return _data

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions