在 Julia 中通过 TCP 读取复合类型

Kad*_*nel 1 types tcp type-conversion julia

我正在尝试通过 TCP 发送/接收复合类型。为了做到这一点,我首先创建监听器部分:

using Sockets

# my-compiste-type
struct Signal
 min::Array{Float32,1}
 max::Array{Float32,1}
end

listener = listen(12345)
receiver = accept(listener)

read!(receiver, Ref()) # problem !!!
Run Code Online (Sandbox Code Playgroud)

另一方面,发送方部分代码:

using Sockets

# my-compiste-type
struct Signal
    min::Array{Float32,1}
    max::Array{Float32,1}
end

s = Signal(rand(0:1, 10), rand(0:1, 10))   # data to send 


client = connect(12345) # connecting to server side
write(client, Ref(s))

Run Code Online (Sandbox Code Playgroud)

现在当我尝试阅读时出现问题read!(receiver, Ref())。如果我写read!(receiver, Ref(Signal)()),就会出现分段错误并且程序退出。如果我写的read!(receiver, Ref(typeof(Signal)())话就会出错。

将复合数据类型从发送者发送到接收者的正确方法是什么?

我还在Julia 讨论页面上发现了类似的问题,但该操作使用 UDPSocket 解决了该问题。我也尝试过,但它使用了reinterpret函数。而且reinterpret函数不会将Signal数据类型转换为UInt或其他类型。

你能帮忙吗?

BR

ps 顺便说一句,我使用的是 Julia 版本 1.0.3。

小智 5

使用您的示例,您可以使用 Julia 的本机序列化功能:

发送:

import Sockets, Serialization

struct Signal # my-compiste-type
    min::Array{Float32,1}
    max::Array{Float32,1}
end

s = Signal(rand(0:1, 10), rand(0:1, 10)) # data to send 
client = Sockets.connect(12345) # connecting to server side
s = Serialization.serialize(client, s) # serialize content
# ... remember to cleanup IO connections with close
Run Code Online (Sandbox Code Playgroud)

接收

import Sockets, Serialization

struct Signal # my-compiste-type
    min::Array{Float32,1}
    max::Array{Float32,1}
end

listener = Sockets.listen(12345)    
receiver = Sockets.accept(listener)
s = Serialization.deserialize(receiver)
# ... remember to cleanup IO connections with close
Run Code Online (Sandbox Code Playgroud)

记住: