簡而言之: 我想做一個客戶端連接和發送/接收消息的套接字服務器(基於sockserv代碼瞭解你一些erlang教程http://learnyousomeerlang.com/buckets-of-sockets) 服務器端組件: 管理器 - 唯一的,從最開始的,產生具有gen_server行爲的進程 gen_server行爲進程 - 每一個都處理連接。erlang套接字和gen_server - 在服務器端沒有收到數據
客戶端: 客戶端連接到套接字併發送幾個字節的數據,然後斷開連接。
代碼細節 我的代碼幾乎是一樣的,在提出的教程。主管是一樣的。 gen_server組件被簡化,因此它只有一個handle_info的情況,它應該可以捕獲所有內容並將其打印出來。
問題 連接成功,但是當客戶端發送數據時,服務器的行爲就好像沒有接收到的數據(我希望這種情況發生時handle_info被調用)。
handle_info確實被調用,但只有當客戶端斷開連接並且該消息報告此事件時。我試圖設置不同的客戶端寫在Erlang或Java中,我試圖設置套接字的主動/被動狀態。本教程的作者在發送消息後設置{active,once}。最後我只設置{活躍,真正}的AcceptSocket作爲被創建後:
handle_cast(accept, S = #state{socket=ListenSocket}) ->
{ok, AcceptSocket} = gen_tcp:accept(ListenSocket),
io:format("accepted connection ~n", []),
sockserv_sup:start_socket(), % a new acceptor is born, praise the lord
inet:setopts(AcceptSocket, [{active, true}]),
send(AcceptSocket, "Yellow", []),
{noreply, S#state{socket=AcceptSocket, next=name}}.
send(Socket, Str, Args) ->
ok = gen_tcp:send(Socket, io_lib:format(Str++"~n", Args)),
ok.
handle_info(E, S) ->
io:format("mothereffing unexpected: ~p~n", [E]),
{noreply, S}.
它aboslutely沒有效果(gen_server PROC與包含由主管創建的原始ListenSocket的狀態初始化)。僅當連接丟失時纔會調用handle_info,因爲客戶端斷開連接。無論何時客戶端發送數據都不會發生
可能是什麼問題?我花了很多時間在這個上,我真的不知道。 非常感謝。
我試過這些選項。他們沒有效果。我已經嘗試了服務器套接字和客戶端套接字之間的簡單交互,並且它可以工作。但不知何故,在這種情況下,套接字由gen_server處理,並且它應該觸發它的handle_info函數,但它不起作用。 – dandroid