Чтение составного типа по TCP в Юлии - PullRequest
1 голос
/ 17 октября 2019

Я пытаюсь отправить / получить составной тип по 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 !!!

С другой стороны, код части отправителя:

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))

Теперь проблема возникает, когда я пытаюсь прочитать read!(receiver, Ref())Если я пишу read!(receiver, Ref(Signal)()), я получаю ошибку сегментации, и программа завершается. И если я пишу read!(receiver, Ref(typeof(Signal)()), я получаю ошибки.

Как правильно отправлять составные типы данных от отправителя к получателю?

Я также нашел похожий вопрос на странице дискурса Джулии , но операция решает проблему с UDPSocket. Я тоже пытался, но он использует reinterpret функцию. И функция переинтерпретации не преобразует тип данных Signal в UInt или другие типы.

Не могли бы вы помочь, пожалуйста?

BR

ps Кстати, я использую Julia версии 1.0.3.

1 Ответ

3 голосов
/ 17 октября 2019

Используя ваш пример, вы можете использовать собственные возможности сериализации Джулии:

Отправка:

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

Получение

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

Имейте в виду:

  • Нативная сериализация Julias будет работать только с одинаковой архитектурой системы и версией Julia.
  • Если вам нужны стандартизированные протоколы, вы можете взглянуть на https://github.com/ExpandingMan/Arrow.jl
...