2017-06-01 74 views
0

我剛開始使用Erlang。我想在Erlang中創建一個TCP服務器。我的TCP客戶端在Android上運行並連接到服務器。 我已經採取了TCP服務器實現從 https://github.com/kevinlynx/erlang-tcpserver從erlang的TCP服務器發送消息

我能夠運行服務器,客戶端連接到它,並從客戶端發送信息到服務器。此外,服務器中的邏輯是每當它從客戶端收到消息時,都會將相同的消息發送回客戶端。

所有這些工作正常,我唯一的問題是如何從erlang shell發送消息給客戶端(無需等待來自客戶端的消息)。 gen_tcp:send()函數需要Socket句柄作爲輸入,無論何時客戶端發送消息,都有一個回調函數,並且它具有套接字句柄,因此它可以用來將消息發送回客戶端,但是該怎麼做除此以外?

回答

2

在服務器端,你必須在某個地方接受連接:

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

我想你可以發送郵件到插座:

gen_tcp:send(Sock, YourPacket) 

如果你不接受連接,然後它不是服務器。

更新回答評論

一種方式是共享監聽套接字(LSock中的例子)。您可以將它保存在可訪問的ETS上,並從外殼調用接受器,儘管它不是聽者的所有者。

否則,您將不得不在服務器上將所有打開的套接字保存在State中,並編寫一個句柄將消息發送到打開的套接字。一個套接字服務器的一個很好的解釋可以找到here

+0

是的服務器接受連接 {ok,Sock} = gen_tcp:accept(LSock),(在tserver.erl的第39行) 但是我的問題是如何得到這個「Sock 「在我運行命令時在shell上?我通過 test:start()運行服務器。 (test.erl是一個文件,start()是啓動服務器的函數) 所以當我在shell上運行它時,如何獲得上面提到的「Sock」?一旦我得到「Sock」,我明白我可以使用gen_tcp:send()發送消息。 我在這裏錯過了什麼嗎? –

+0

更新後的答案是否正確? –

0

我剛剛開始使用Erlang。我想在Erlang中創建一個TCP服務器。

我認爲這個問題是您正在使用的軟件,設置了一個客戶端和服務器之間的通信通道:

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

現在你有第三個實體:

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

      (erlang shell) 

並且您希望erlang shell與客戶端進行通信。這一切都很好,但是你使用的代碼並沒有提供這個。這聽起來像你還希望你的客戶端充當erlang shell的服務器。你爲什麼需要erlang shell向客戶端發送消息?

Erlang的外殼可能成爲服務器的第二個客戶端:

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

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

但是,這並不利於二郎殼與客戶直接溝通。 erlang shell可以向服務器發送一些信息,服務器可以將該信息存儲在狀態中,然後服務器可以在客戶端下次發出請求時將狀態傳遞給客戶端。

如果二郎的殼具有客戶端的PID,Erlang的外殼總是可以做:

Pid ! "hello client" 

,如果客戶是在接收語句等待,那麼客戶可以提取從該消息中的其郵箱。你的客戶是什麼樣的?