From 0fed584c13f4f60071a0b306b79ea69c4ea919a8 Mon Sep 17 00:00:00 2001 From: TinWoodman92 Date: Tue, 13 Jun 2023 19:58:23 -0500 Subject: Updated sockets connection to binary. --- dialoguer/__init__.py | 27 ++++++++++--------- dialoguer/context_script.r | 66 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 70 insertions(+), 23 deletions(-) diff --git a/dialoguer/__init__.py b/dialoguer/__init__.py index 23dd8f2..2692167 100644 --- a/dialoguer/__init__.py +++ b/dialoguer/__init__.py @@ -2,13 +2,13 @@ import os import subprocess import threading import socket +from . import binary_conversion -HEADER = 256 +HEADER = 2048 PORT = 6011 SERVER = 'localhost' ADDR = (SERVER, PORT) FORMAT = 'utf-8' -DISCONNECT_MESSAGE = b'!DISSCONNECT' server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(ADDR) @@ -44,28 +44,31 @@ class Dialogue: self._connect.join() self.send(self.file_path) - msg = self.recv() - self.active = (msg == b'TRUE') + data = self.recv() + data = binary_conversion.convert_from_binary(data, type('s')) + self.active = (data == 'TRUE') def open(self, wait = True): self._open = threading.Thread(target=self.launch_and_connect) if wait: self._open.run() else: self._open.start() - def send(self, msg): - data = bytes(msg, FORMAT) - data += b' ' * (HEADER - len(data)) - self.conn.send(data) + def send(self, data): + bin_data = reversed(data) + bin_data = "".join(bin_data) + bin_data = binary_conversion.convert_to_binary(bin_data) + self.conn.send(bin_data) def recv(self): - msg = self.conn.recv(HEADER).strip() - while msg == b'\x00': - msg = self.conn.recv(HEADER).strip() - return msg + data = self.conn.recv(HEADER) + while data == b'\x00': + data = self.conn.recv(HEADER) + return data def import_variable(self, var_name): self.send(var_name) val = self.recv() + val = binary_conversion.convert_from_binary(val, type('s')) return val def evaluate_expression(self, expr): diff --git a/dialoguer/context_script.r b/dialoguer/context_script.r index ddc7dd9..56074a5 100644 --- a/dialoguer/context_script.r +++ b/dialoguer/context_script.r @@ -1,4 +1,4 @@ -HEADER <- 256 +HEADER <- 2048 PORT <- 6011 SERVER <- "localhost" FORMAT <- "utf-8" @@ -7,7 +7,8 @@ DISCONNECT_MESSAGE <- "!DISSCONNECT" con <- socketConnection( host = SERVER, port = PORT, - server = FALSE + server = FALSE, + open = "a+b" ) display_msg <- function(msg) { @@ -19,22 +20,63 @@ display_msg <- function(msg) { ) } -send <- function(conn, msg) { - sendme <- paste(msg, strrep(" ", HEADER - nchar(msg)), sep = "") - writeChar(sendme, conn) +add_missing_bits <- function(bin_data, base = 8) { + missing_bits <- length(bin_data) %% base + if (missing_bits > 0) { + missing_bits <- rep(as.raw(00), times = base - missing_bits) + bin_data <- c(bin_data, missing_bits) + } + return(bin_data) +} + +convert_from_binary <- function(bin_data, to_type) { + data <- NA + bin_data <- add_missing_bits(bin_data) + if (to_type == "character") { + data <- packBits(bin_data, "raw") + data <- rawToChar(data) + } else if (to_type == "integer") { + data <- packBits(bin_data, "raw") + data <- as.integer(data) + } + return(data) +} + +convert_to_binary <- function(data) { + bin_data <- NA + if (is.character(data)) { + bin_data <- charToRaw(data) + bin_data <- rawToBits(bin_data) + } else if (is.integer(data)) { + bin_data <- as.raw(data) + bin_data <- rawToBits(bin_data) + } + return(bin_data) +} + +send <- function(conn, data) { + writeBin(data, conn) } -recv <- function(conn) { - suppressWarnings(msg <- trimws(readChar(conn, HEADER))) - while (length(msg) == 0) { - #cat('ALERT\n') - suppressWarnings(msg <- trimws(readChar(conn, HEADER))) +recv <- function(conn, silent = TRUE) { + if (silent) { + suppressWarnings(data <- readBin(conn, "raw", HEADER)) + while (length(data) == 0) { + suppressWarnings(data <- readBin(conn, "raw", HEADER)) + } + } else { + data <- readBin(conn, "raw", HEADER) + while (length(data) == 0) { + cat('ALERT\n') + data <- readBin(conn, "raw", HEADER) + } } - return(msg) + return(data) } #receive target file path file_path <- recv(con) +file_path <- convert_from_binary(file_path, "character") #load target file source(file_path) @@ -49,8 +91,10 @@ while (msg != '!DISCONNECT') { display_msg(msg) val <- get(msg) val <- as.character(val) + val <- convert_to_binary(val) send(con, val) msg <- recv(con) + msg <- convert_from_binary(msg, "character") } close(con) \ No newline at end of file -- cgit v1.2.3