我刚刚开始使用Erlang。我想在Erlang中创建一个TCP服务器。我的TCP客户端在Android上运行并连接到服务器。 我从中获取了TCP服务器的实现 https://github.com/kevinlynx/erlang-tcpserver
我能够运行服务器,将客户端连接到服务器并将消息从客户端发送到服务器。此外,服务器中的逻辑是,无论何时从客户端接收消息,它都会将相同的消息发送回客户端。
所有这一切都运行正常,我唯一的问题是如何从erlang shell向客户端发送消息(无需等待来自客户端的消息)。 gen_tcp:send()函数需要输入Socket句柄,每当客户端发送消息时,都有一个回调,它有套接字句柄,因此它可以用来将消息发送回客户端,但是怎么办呢?
答案 0 :(得分:3)
在服务器端,您必须接受某处的连接:
{ok, Sock} = gen_tcp:accept(LSock)
我想你可以向该套接字发送消息:
gen_tcp:send(Sock, YourPacket)
如果您不接受连接,则它不是服务器。
更新以回复评论
一种方法是共享侦听器套接字(示例中为LSock
)。您可以将其保存在可访问的ETS上,并从shell调用接收器,尽管它不是监听器的所有者。
否则,您将不得不将所有内容都包装在服务器上,并将打开的套接字保存在State
中,并编写句柄以将消息发送到已打开的套接字。可以找到套接字服务器的一个很好的解释here。
答案 1 :(得分:0)
我刚刚开始使用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可以向服务器发送一些信息,服务器可以在状态中存储该信息,然后服务器可以在客户端下次发出请求时将状态传递给客户端。
如果erlang shell具有客户端的Pid,则erlang shell可以始终执行:
Pid ! "hello client"
如果客户端在receive语句中等待,则客户端可以从其邮箱中提取该消息。您的客户是什么样的?