2012-08-26 123 views
3

我開始學習Erlang,希望能夠爲實時多人遊戲創建遊戲服務器。目前,我正在努力估計Erlang對斯卡拉造成的工作量和頭痛。所以,首先,我創建一個簡單的Erlang服務器進程。我在Jesse Farmer上發現了一個很好的教程,我修改了這些教程以瞭解更多信息。我的修改後的代碼與他的echo服務器類似,只不過它用英文單詞表示並簡單地返回Lojban等價物。但是,只有通配符的情況纔會被選中。下面是代碼:Erlang TCP服務器處理

​​

我目前的測試是打開兩個終端窗口,並執行

[CONSOLE 1] 
erl 
c(translate). 
translate:listen(8888). 

[CONSOLE 2] 
telnet localhost 8888 
whatever 
Hello 

,輸出變爲:

I don't understand 
I don't understand 

如何可以解析傳入的數據?這種模式匹配的風格似乎完全失敗。謝謝!

回答

3

試試這個:

case binary_to_list(Data) of 
    "Hello\r\n" -> gen_tcp:send(Socket, "this will be good variant\n"); 
    _ -> gen_tcp:send(Socket, "I don't understand") 
end, 

或者沒有明確的轉換:

case Data of 
    <<"Hello\r\n">> -> gen_tcp:send(Socket, "this will be good variant\n"); 
    _ -> gen_tcp:send(Socket, "I don't understand") 
end, 

從評論

更新,以更復雜的匹配工作,除去"\r\n"後綴第一:

Content = list_to_binary(lists:subtract(binary_to_list(Data), "\r\n")), 
case Content of 
    <<"Hello">> -> gen_tcp:send(Socket, <<"Good day!\n">>); 
    <<"My name is, ", Name/binary>> -> gen_tcp:send(Socket, <<"Hello ", Name/binary, "!\n">>); 
    _ -> gen_tcp:send(Socket, "I don't understand") 
end, 
+0

現象!這似乎很好。在此之後,我將如何從輸入數據包中提取信息?我試過類似'<<「我的名字是」,名稱「,\ r \ n」>> - > gen_tcp:send(Socket,「Hello」++ Name ++「!\ n」)',但它永遠不會也碰到這種情況。 – Grimless

+1

@Grimless兩個錯誤:1.在這裏匹配'Name'的正確方法:''「我的名字是」,名稱:10/binary「\ r \ n」''其中'10'是'Name'長度(你應該在任何情況下爲非休息匹配指定長度)。我知道,這不是你真正想要:)所以嘗試首先拆分'數據'(以'Name'將二進制的最後部分)。 2.「Hello」++名稱++「!\ n」'會失敗。這不是:''「Hello」,Name/binary,「!\ n」>>(或者如果你想使用列表「Hello」++ binary_to_list(Name)++「!\ n」但對於簡單操作來說太多的操作)。 –

+0

嗯,''你好「++名稱++」!\ n「似乎編譯得很好,但它可能不會引起問題,因爲該子句永遠不會執行。我將如何去'分割'數據'第一'?我無法保證輸入名稱的長度,那麼'Name:10/binary'如何處理輸入,例如「The World of Duke」?此外,將代碼更改爲'<<「我的名字是」,名稱:10/binary「,\ r \ n」>> - > gen_tcp:send(Socket,string:join([「mi'o」,Name, 「\ r \ n」],「」));'仍然不起作用。 – Grimless