2012-11-19 68 views
0

簡而言之: 我想做一個客戶端連接和發送/接收消息的套接字服務器(基於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,因爲客戶端斷開連接。無論何時客戶端發送數據都不會發生

可能是什麼問題?我花了很多時間在這個上,我真的不知道。 非常感謝。

回答

0

總之,注意選項。我確實沒有注意到這套方案的含義。我嘗試了一個更加狹隘的情況,並將其解決。我的問題是{packet,line}選項,這意味着\ n被認爲是一個消息分隔符。

0

您是否嘗試在http://www.erlang.org/doc/man/inet.html#setopts-2

INET設置其他選項:setopts(AcceptSocket,[{活性,真}])

例如:

{分組,線路}讀取一次一行

二進制數據以二進制形式讀入數據。使用

我也通過類似的活動工作基於該教程最近,我的選擇是:

INET:setopts(LSocket,[{活躍,真實},{包,行},二進制,{reuseaddr ,true}]),

+0

我試過這些選項。他們沒有效果。我已經嘗試了服務器套接字和客戶端套接字之間的簡單交互,並且它可以工作。但不知何故,在這種情況下,套接字由gen_server處理,並且它應該觸發它的handle_info函數,但它不起作用。 – dandroid

相關問題