【问题标题】:Sending Message from TCP server in erlang在erlang中从TCP服务器发送消息
【发布时间】:2017-11-02 15:39:47
【问题描述】:

我刚刚开始使用 Erlang。我想在 Erlang 中创建一个 TCP 服务器。我的 TCP 客户端在 Android 上运行并连接到服务器。 我已经从 https://github.com/kevinlynx/erlang-tcpserver

我能够运行服务器,将客户端连接到它并将消息从客户端发送到服务器。此外,服务器中的逻辑是,每当它从客户端接收到消息时,它都会将相同的消息发送回客户端。

这一切都很好,我唯一的问题是如何从 erlang shell 向客户端发送消息(无需等待来自客户端的消息)。 gen_tcp:send() 函数需要 Socket 句柄作为输入,每当客户端发送消息时,都会有一个回调,并且它具有套接字句柄,因此它可以用于将消息发送回客户端,但不然怎么办?

【问题讨论】:

    标签: erlang erlang-shell


    【解决方案1】:

    在服务器端,您必须在某处接受连接:

     {ok, Sock} = gen_tcp:accept(LSock)
    

    我想你可以向那个套接字发送一条消息:

    gen_tcp:send(Sock, YourPacket)
    

    如果您不接受连接,则它不是服务器。

    更新回答评论

    一种方法是共享侦听器套接字(示例中为LSock)。您可以将其保存在可访问的 ETS 上并从 shell 调用接受器,尽管它不是侦听器的所有者。

    否则,您将不得不将所有内容包装在服务器上,并将打开的套接字保存在 State 中,并编写一个句柄以将消息发送到打开的套接字。可以在here 找到对套接字服务器的一个很好的解释。

    【讨论】:

    • 是的,服务器上正在接受连接 {ok, Sock} = gen_tcp:accept(LSock), (在 tserver.erl 中的第 39 行)但我的问题是我如何得到当我运行命令时,外壳上的这个“袜子”?我正在通过 test:start() 运行服务器。 (test.erl 是一个文件,而 start() 是其中的一个函数,它启动服务器)所以当我在 shell 上运行它时,我如何获得上面提到的“Sock”?一旦我得到“Sock”,我就知道我可以使用 gen_tcp:send() 来发送消息。我在这里错过了什么吗?
    【解决方案2】:

    我刚刚开始使用 Erlang。我想在 Erlang 中创建一个 TCP 服务器。

    我认为问题在于您正在使用在客户端和服务器之间建立通信通道的软件:

    (client) ================== (server)
    

    现在你有了第三个实体:

    (client) ================== (server)
    
              (erlang shell)
    

    并且您希望 erlang shell 与客户端进行通信。这一切都很好,但是您使用的代码并没有提供这一点。听起来您还希望您的客户端充当 erlang shell 的服务器。为什么需要 erlang shell 向客户端发送消息?

    erlang shell 可以成为服务器的第二个客户端:

    (client) ================== (server)
    
    (erlang shell) ============ (server)
    

    但这无助于 erlang shell 直接与客户端通信。 erlang shell 可以向服务器发送一些信息,服务器可以将这些信息存储在 State 中,然后服务器可以在客户端下次发出请求时将 State 传递给客户端。

    如果 erlang shell 有客户端的 Pid,那么 erlang shell 总是可以这样做:

    Pid ! "hello client"
    

    如果客户端在接收语句中等待,则客户端可以从其邮箱中提取该消息。你的客户是什么样的?

    【讨论】:

      猜你喜欢
      • 2013-04-29
      • 2014-03-29
      • 2021-02-28
      • 2017-05-03
      • 1970-01-01
      • 2019-07-23
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多