将erlang套接字存储到数据库

Posted

技术标签:

【中文标题】将erlang套接字存储到数据库【英文标题】:Store erlang socket to database 【发布时间】:2019-05-31 18:31:11 【问题描述】:

我需要将套接字存储到数据库中, gen_tcp:accept 返回类似

#Port<0.5>

我可以使用 io_lib:format 将其转换为位串

["Port<0.5>"]

要将其存储到数据库中,但如何将其转换回原始状态以使用它来发送和接收数据?

更新: 我试过term_to_binarymysql-otp 插入失败所以我做了binary_to_list(term_to_binary(Socket)) ,它插入得很好但在二进制文件的开头添加了额外的 > 到数据库中,任何解决方案?为什么会这样?如果它没有添加额外的数据,我可以使用binary_to_term 将其转换回来。

【问题讨论】:

您好,欢迎来到 Erlang!我认为你在逆流而上。想要将套接字句柄存储到数据库中似乎是一种“设计气味”。拥抱 Erlang,而不是试图让 Erlang 适应你用另一种语言做某事的方式:-) 它是一个聊天服务器,我需要存储在线用户套接字,在变量中存储大量套接字不是一个好主意,是吗?我对此感到担忧,但不幸的是,在堆栈溢出问题上提出这些问题会导致投票过于宽泛,并禁止发布未来的问题。 字典能很好地处理数千个套接字吗? 我看到了使用列表的担忧,当然,在这种情况下这不是一个好方法。您可以使用例如 ETS,它是内置的,不需要任何转换。但对于这类问题,我建议在 Erlang 邮件列表或 Slack 频道上提问。 感谢您宝贵的时间和建议,我非常感谢。 【参考方案1】:

我将 varchar 更改为 varbinary,现在我可以直接将 term_to_binary 插入数据库,然后使用 binary_to_term 重用它。

【讨论】:

以上是关于将erlang套接字存储到数据库的主要内容,如果未能解决你的问题,请参考以下文章

从带有 ASCII 数据包大小标头的 Erlang 活动模式的套接字接收数据包

为啥套接字关闭 Erlang

带有牛仔和 websocket 的 erlang 聊天室

Windows上erlang的开发环境

Erlang:连接到服务器,并在同一个套接字上接收输入

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