在 Erlang 中通过 tcp 套接字发送元组

Posted

技术标签:

【中文标题】在 Erlang 中通过 tcp 套接字发送元组【英文标题】:Send tuple through tcp socket in Erlang 【发布时间】:2016-09-30 06:31:53 【问题描述】:

我正在尝试使用 tcp 套接字发送元组,我正在使用 gen_tcp:send(Socket, elem1,elem2) 但我收到此错误,“输出端口 'tcp_inet' 上的值错误”谁能告诉我如何通过套接字发送元组?

感谢您的回复。

【问题讨论】:

【参考方案1】:

第二个参数必须是一个数据包:

Packet = string() | binary() | HttpPacket

HttpPacket = HttpRequest
           | HttpResponse
           | HttpHeader
           | http_eoh
           | HttpError
HttpRequest = http_request, HttpMethod, HttpUri, HttpVersion
HttpResponse =
    http_response, HttpVersion, integer(), HttpString
HttpHeader =
    http_header,
     integer(),
     HttpField,
     Reserved :: term(),
     Value :: HttpString
...

在您的情况下,elem1,elem2 确实与这些类型中的任何一个匹配,并且您会收到错误消息。发送任意term的常用方式是先序列化:term_to_binary(YourTerm)

并在收到时反序列化:binary_to_term(ReceivedBinary)

【讨论】:

我的问题是我将该元组发送到 Java 客户端,你知道如何在 Java 中反序列化它吗? 看看这个erlang.org/doc/apps/erts/erl_ext_dist.html 还有***.com/questions/7817213/… 和***.com/questions/15775554/… 或者只是进行序列化并自己构建数据包,Java 客户端知道如何获取每个元素并解释它。这假定每个元素都是对 Java 客户端具有直接意义的东西,例如不是元组。 :-) java 中不存在 2 个原子的元组,因此您首先需要定义如何转换 erlang 术语以使 java 程序可以理解它们。 JSON 对您来说可能很有趣,Java 和 Erlang 都有用于编码/解码的库,您应该检查类型解释是否符合您的需求。

以上是关于在 Erlang 中通过 tcp 套接字发送元组的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中通过 tcp 套接字发送结构

《asyncio 系列》8. 在 asyncio 中通过流(StreamReaderStreamWriter)来实现 TCP 请求的发送与接收

在 C 中通过具有正确填充和字节序的套接字发送结构

在 Qt 中通过 TCP 传输大文件

erlang 发送套接字西里尔文数据

Erlang 套接字发送超时永远不会发生