在 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 套接字发送元组的主要内容,如果未能解决你的问题,请参考以下文章
《asyncio 系列》8. 在 asyncio 中通过流(StreamReaderStreamWriter)来实现 TCP 请求的发送与接收