[英]Sending Message from TCP server in erlang
我剛剛開始使用Erlang。 我想在Erlang中創建一個TCP服務器。 我的TCP客戶端在Android上運行並連接到服務器。 我從https://github.com/kevinlynx/erlang-tcpserver獲取了TCP服務器實現
我能夠運行服務器,將客戶端連接到它,並從客戶端向服務器發送消息。 此外,服務器中的邏輯是,無論何時從客戶端接收消息,它都會將相同的消息發送回客戶端。
這一切都很好,我唯一的問題是如何從erlang shell向客戶端發送消息(無需等待來自客戶端的消息)。 gen_tcp:send()函數需要輸入Socket句柄,每當客戶端發送消息時,都有一個回調,它有套接字句柄,因此它可以用來將消息發送回客戶端,但是如何做呢?
在服務器端,您必須接受某處的連接:
{ok, Sock} = gen_tcp:accept(LSock)
我想你可以向該套接字發送一條消息:
gen_tcp:send(Sock, YourPacket)
如果您不接受連接,那么它不是服務器。
更新以回答評論
一種方法是共享監聽器套接字( LSock
中為LSock
)。 您可以將其保存在可訪問的ETS上,並從shell調用acceptor,盡管它不是偵聽器的所有者。
否則,您將不得不將所有內容都包裝在服務器上,以便將打開的套接字保持在State
,並編寫句柄以將消息發送到打開的套接字。 可以在這里找到套接字服務器的一個很好的解釋。
我剛剛開始使用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語句中等待,則客戶端可以從其郵箱中提取該消息。 您的客戶是什么樣的?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.