从R套接字读取RAW数据

时间:2018-01-08 14:39:05

标签: r sockets binary

为了在Python和R之间非常快速地交换数据,我编写了一个相当脏的解决方案。在linux和OSX上。可能不是我现在必须让它在Windows中工作。

下面的代码运行一个python脚本,它构建一个原始向量,可以通过RApiSerialise序列化为R对象。

COMMAND = "python"
PATH_TO_SCRIPT='/GetCassandraData.py'    

QueryCassandra <- function(query){
  allArgs = c(PATH_TO_SCRIPT, query)

  output.connection <- rawConnection(raw(length = 0), "r+")
  exec_wait(COMMAND, args = allArgs, std_out = output.connection)

  output <- rawConnectionValue(output.connection)
  close(output.connection)

  final <- unserializeFromRaw(output)

  return(final)
}

这适用于OSX&amp;但是,Linux有一种趋势是在0x0a(换行)字节之前放置一个0x0d(回车)字节,这使得RApiSerialise无法对其进行反序列化。

我现在正尝试通过套接字进行通信来解决问题,但我似乎无法找到将make.socket()对象中的数据读取到原始向量的方法。

我试过了:

data <- read.socket(datasocket)

导致:

  

read.socket(datasocket)中的错误:     在字符串中嵌入nul:&#39; X \ n \ 0 \ 0 \ 0 \ 002 \ 0 \ 003 \ 004 \ 002 \ 0 \ 002 \ 003 \ 0&#39;

函数read.socket()尝试读取字符串并且不接受空字节。

有没有办法在R?

中读取套接字数据到原始向量

1 个答案:

答案 0 :(得分:0)

R服务器端:

library(sys)    

COMMAND = "python"
PATH_TO_SCRIPT='/lengthCheck.py'
allArgs = c(PATH_TO_SCRIPT)
sys::exec_background(COMMAND, args = allArgs, std_out = TRUE, std_err = TRUE)    

datasocket <- socketConnection(port = 1205, server = TRUE, open = "w+b", blocking = TRUE)
on.exit(close(datasocket))
datasize <- readBin(datasocket, what = "double")
data <- readBin(datasocket, what = "raw", n = datasize)

Python客户端:

import struct
import socket
import time    

your_raw_array_to_send = bytearray([0x58, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x04, 0x02, 0x00, 0x02, 0x03, 0x00])
arrayLength = len(your_raw_array_to_send)    

datasize = struct.pack('d', arrayLength)    

# Wait 100ms for R to set up a listening socket
time.sleep(.100)    

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 1205))
client_socket.send(datasize)    

client_socket.send(your_raw_array_to_send)
client_socket.close()