问题标签 [gen-tcp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3807 浏览

tcp - Erlang tcp 服务器/客户端发送消息

我目前正在编写一个简单的服务器,它将与客户端连接,然后在服务器充当中介的情况下相互交谈。

设置是:

  • 服务器启动
  • 2 客户端连接到服务器
  • Client1/2 发送一条带有其唯一 ID(一个原子)的消息
  • 服务器将此 ID 与 Socket PID 一起保存
  • Client1 发送 {send_to_id, client2id, Message}
  • 服务器消息 Client2

但这对我不起作用,我收到 function_clause 错误。

所以基本上我想用 tcp_send 向客户端发送一条消息,而不是让客户端成为“服务器”,但只能使用 recv。这可能吗?

服务器代码:

监听代码:

客户端代码:

您建议我重写所有内容还是我的想法可能?预先感谢!

编辑:添加了测试运行。

0 投票
1 回答
103 浏览

erlang - 为什么 gen_tcp 没有在 Erlang shell 中定义?

在我输入gen_然后在 erlang shell 中输入 Tab 之后,我得到gen_server, gen_event,但我没有得到gen_tcp. 如何gen_tcp在 Erlang shell 中使用?

0 投票
1 回答
232 浏览

sockets - 接收 TCP 数据包作为消息而不是使用 gen_tcp:recv/2

我正在用 Erlang 编写一个分布式聊天应用程序,以供我自己学习/受益。我有一个维护持久 TCP 连接的客户端和服务器。客户端使用 gen_tcp:connect/3 发起连接。服务器实际上分布在多个节点上。

gen_tcp 文档说:

可以使用 send/2 将数据包发送到返回的套接字 Socket。从对等方发送的数据包作为消息传递:

{tcp,套接字,数据}

因此,我的客户端能够接收服务器作为普通 Erlang 消息发送的任何数据。这对我的应用程序来说是可取的。

问题是我看不到任何方法可以使服务器上的连接以相同的方式进行。如果我的服务器可以接收作为 Erlang 消息发送的数据,我会很高兴的。这样,服务器可以在等待客户端发送消息的同时发送数据(即当聊天室中的另一个人发送消息时)。

有没有办法实现这种行为?

编辑:我知道 prim_inet:async_accept/2,但如果可能的话,我更喜欢记录在案的方法。

0 投票
1 回答
661 浏览

sockets - 在 Erlang 中向 gen_tcp 服务器发送大消息

我正在尝试实现一个客户端服务器程序。服务器使用以下代码设置监听套接字:

gen_tcp:listen(端口, [二进制, {active, true}])

问题是当客户端向服务器发送大消息(元组列表)时,服务器会收到几条消息。似乎 TCP 正在将长消息分成几条消息。

我们如何处理一次获得整个长消息?

0 投票
1 回答
1401 浏览

sockets - erlang:控制进程(),或不控制进程()

考虑以下简单回显服务器的 erlang 代码:

回声监听器:

回声工作者:

每当接受客户端套接字时,回显服务器就会生成一个回显工作者并将客户端套接字直接作为函数参数传递。在代码中有controller_process(),但我试过没有调用controlling_process() 的代码,它也可以工作。

control_process() 的真正目的是什么?什么时候需要?

提前致谢。

0 投票
1 回答
245 浏览

tcp - TCP 服务器没有响应

我使用 gen_tcp OTP 模块在 Elixir 中编写了以下 TCP 服务器:

一旦我使用 telnet 连接到服务器,它就会断开连接。知道发生了什么吗?

0 投票
1 回答
420 浏览

tcp - 如何处理 Erlang 中 TCP 流中数据包的错误长度标头?

我正在使用 Erlang 通过 TCP 接收消息gen_tcp。如选项所指定,使用 4 字节长度的标头将流划分为数据包{packet, 4}。这就是我所说的gen_tcp:listen/2

正如你所看到的,我使用了这个{active, once}选项,这样我就可以从进程邮箱中获取我的数据包而不会淹没它。只要长度标头正确,它就可以正常工作。如果不是,任何事情都可能发生。所以我想以某种方式处理错误数据包的可能性。

这有点棘手,因为我实际上正在处理流。忽略错误的数据包是可以的,但是我如何让 Erlang 跳过这些数据包并识别后面的数据包?这个问题一般是怎么处理的?

使用分隔符更好吗?我已经查看packetgen_tcp. 特别是以下内容:

我唯一真正理解的含义是line,但我认为这不是一个好的选择。我期待收到在我不熟悉的 Objective C 中发送和构建的包,其中包含许多不同类型的数据,而不仅仅是字符串。

0 投票
1 回答
341 浏览

sockets - 是否有必要在进程终止时关闭 gen_tcp 连接?

我想我的问题相当直截了当。

我想知道在gen_tcp:close/1即将终止的进程所拥有的套接字上使用是否有任何意义。连接自动关闭并返回{tcp_closed, Socket}到另一端的连接进程,就像close调用时一样,所以我猜效果是一样的,close只有在连接必须在终止前一段时间关闭时才需要。

这是正确的还是有任何理由为什么我应该尝试close在套接字上使用,即使进程即将终止?

监听套接字或另一端连接的进程不是Erlang进程时有什么区别吗?

0 投票
1 回答
73 浏览

erlang - Erlang gen_tcp 是累积接收到的数据

这是我接收数据的代码

我串行发送到套接字 - 1,然后是 2,然后是 3,然后是 4,然后是 5

代码是累积接收到的数据

它打印到屏幕上

如何将代码修改为打印的代码

该数据未累积

0 投票
2 回答
2004 浏览

erlang - Erlang OTP 主管 gen_tcp - {error,eaddrinuse}

我看不到将主管添加到崩溃的 gen_tcp:listen-thread 将如何实际重新启动该工作程序。由于崩溃会使我想听的端口暂时无用。当发生崩溃并且我尝试手动重新启动我的应用程序时,我收到“{error,eaddrinuse}”。我还没有为这个工人实施任何主管,因为我看不到它是如何工作的。

如何重新启动 gen_tcp:listen?