為了熟悉Erlang的套接字編程開始編寫一個“聊天室”程序。基本流程如下:
1.服務器啟動監聽指定端口
2.啟動一個gen_server 作為聊天室進程,里面使用ets 保持當前所有客戶端連接信息,並負責將某個客戶端的消息廣播到所有在線客戶端
3.服務器接受客戶端連接,並綁定到一個gen_server進程
4.客戶端維護進程接受客戶端發送的消息,調用聊天室進程函數進行廣播
5.客戶端維護進程接受聊天室發送的消息,轉發給客戶端
客戶端信息包括id、pid、socket、nickname、sex、age、province 等。
目前包括以下幾個模塊:
echatServer.erl :服務器端程序啟動模塊。
chat_room.erl :聊天室模塊,一個gen_server負責處理客戶端請求,保存了所有客戶端的連接信息。
id_generator.erl:負責為每一個連接的客戶端生成唯一ID
client_session.erl:與客戶端socket綁定的gen_server回調模塊,接收和發送消息
chat_acceptor.erl:負責監聽端口和處理連接的客戶端socket
代碼如下:
echatServer.erl:
chat_room.erl:
id_generator.erl:
client_session.erl:
chat_acceptor.erl:
為了測試這個服務器程序,我用JAVA寫了個簡單的client端程序,如下:
MainForm.java
SocketClient.java
測試方法:
啟動服務器端:
>echatServer:start().
啟動兩個客戶端:
run as java Application
效果圖:
發送:
發送:
服務器端打印出的日志:
至此基本的聊天功能實現了。順便說下,以上的服務器端程序將監聽到的socket連接交由單獨的進程處理了。
還有不足就是客戶端退出時會引發服務器端異常退出,這個需要對socket連接斷開進行處理,下一步對這個進行修改。