Lampiran 2 Listing Program config.hrl -define(server_node, server@supernova). interface.hrl -record(logon,{client_pid, username}). -record(message,{client_pid, to_name, message}). -record(abort_client,{message}). -record(server_reply,{message}). -record(message_from,{from_name, message}). -record(message_to,{to_name, message}).
server.erl -module(server). -export([start/0, server/0,stop/0]). -include("interface.hrl").
server() -> process_flag(trap_exit, true), server([]).
server(User_List) -> Waktu=io_lib:format("~w:~w:~w~n",tuple_to_list(time())), io:format("-> Daftar User yang logon pukul ~s ~p~n~n", [Waktu,User_List]),
receive #logon{client_pid=From, username=Name} -> New_User_List = server_logon(From, Name, User_List),
L 15
server(New_User_List); {'EXIT', From, _} -> New_User_List = server_logoff(From, User_List), server(New_User_List); #message{client_pid=From, to_name=To, message=Message} -> server_transfer(From, To, Message, User_List), server(User_List) end.
start() ->
case whereis(messenger) of undefined ->
io:format("~n################################################~n", []),
io:format("################################################~n",[] ), io:format("########### SIMPLE ERLANG MESSENGER ############~n",[]), io:format("###########
[ SEM ] 1.0 2006
############~n",[]),
io:format("################################################~n",[] ),
L 16
io:format("################################################~n~n", []), io:format("- note :\'server:start().\' <- menjalankan server~n",[]), io:format("
\'server:stop().\'
<-
menghentikan server~n~n",[]),
Waktu=io_lib:format("~w:~w:~w~n",tuple_to_list(time())), io:format("-> Dimulai pukul ~s ~n~n",[Waktu]), io:format("-> server status
[
running ]~n~n",[]), start_1(); _ -> io:format("~n~n<<-------- Server sedang berjalan ------->>~n~n",[]) end.
start_1() -> register(messenger, spawn(?MODULE, server, [])).
stop() -> case whereis(messenger) of undefined -> io:format("~n~n<<-------------------- Server belum dijalankan -------------------->> ~n",[]), io:format("<<----- Jalankan dengan menggunakan perintah server:start() ------->>~n~n",[]), exit(normal); _ ->
L 17
Waktu=io_lib:format("~w:~w:~w~n",tuple_to_list(time())), io:format("~n~n-> stop server sukses
[
]~n",[]), io:format("-> stop pukul ~s ~n",[Waktu]), io:format("-> server status
[
stop
]~n",[]),unregister(messenger)
end.
server_logon(From, Name, User_List) ->
case lists:keymember(Name, 2, User_List) of true ->
From ! #abort_client{message="<<---- sudah ada yang menggunakan user tersebut ---->>"}, User_List; false ->
From ! #server_reply{message="<< Logon sukses -- ketik client:help(). untuk melihat daftar perintah >>"}, link(From), [{From, Name} | User_List] end.
server_logoff(From, User_List) -> lists:keydelete(From, 1, User_List).
L 18
server_transfer(From, To, Message, User_List) ->
case lists:keysearch(From, 1, User_List) of false -> From ! #abort_client{message="<<---- Anda belum login --->>"}; {value, {_, Name}} -> server_transfer(From, Name, To, Message, User_List) end.
server_transfer(From, Name, To, Message, User_List) ->
case lists:keysearch(To, 2, User_List) of false -> From ! #server_reply{message="<<---- penerima tidak dapat ditemukan ---->>"}; {value, {ToPid, To}} -> ToPid ! #message_from{from_name=Name, message=Message}, From !
#server_reply{message="<<---- pesan terkirim ----
>>"} end.
L 19
mess_client.erl
-module(mess_client). -export([client/2]). -include("interface.hrl").
client(Server_Node, Name) -> {messenger, Server_Node} ! #logon{client_pid=self(), username=Name}, await_result(), client(Server_Node).
client(Server_Node) -> receive logoff -> exit(normal); #message_to{to_name=ToName, message=Message} -> {messenger, Server_Node} ! #message{client_pid=self(), to_name=ToName, message=Message}, await_result(); {message_from, FromName, Message} -> io:format("Pesan dari ~p: ~p~n", [FromName, Message]) end, client(Server_Node).
L 20
await_result() -> receive #abort_client{message=Why} -> io:format("~p~n", [Why]), exit(normal); #server_reply{message=What} -> io:format("~p~n", [What])
after 5000 -> io:format("Tidak ada respon dari server~n", []), exit(timeout) end.
client.erl
-module(client). -export([logon/1, logoff/0, message/2,help/0]). -include("interface.hrl"). -include("config.hrl").
logon(Name) ->
case whereis(mess_client) of undefined -> register(mess_client, spawn(mess_client, client, [?server_node, Name])); _ -> io:format("~n<<---- anda sedang login ---->>~n",[]) end.
L 21
logoff() -> case whereis(mess_client) of undefined -> io:format("~n<<---- anda belum login. silakan login terlebih dahulu ---->> ~n",[]); _ -> io:format("~n<<---- anda telah logoff. Terima kasih ---->> ~n",[]),mess_client ! logoff end.
message(ToName, Message) -> case whereis(mess_client) of undefined -> io:format("~n<<---- Anda belum login. silakan login terlebih dahulu ---->>~n",[]); _ -> mess_client ! #message_to{to_name=ToName, message=Message} end.
help() -> io:format("~n<<----- Berikut ini command-command yang dapat digunakan dalam SEM 1.0 ----->>~n~n",[]), io:format("-------------------------------- Supernova ----------------------------------~n",[]), io:format(" Untuk login
:
client:logon(Nama).~n~n",[]), io:format(" -contoh login : client:logon(nofa) <-- benar~n",[]), io:format("
: client:logon(Nofa) <-- salah~n",[]),
L 22
io:format("
: client:logon(nofa ryan) \\
client:logon(Nofa_ryan) <-- salah~n",[]), io:format("~n
dimulai dengan huruf kecil atau satu kata, apabila
ingin dengan huruf besar~n",[]), io:format("
ataupun lebih dari satu kata gunakan tanda petik,
contoh~n~n",[]), io:format(" -client:logon(\"Ryan\") \\ client:logon(\"Ryan Ganteng\") <-- benar~n~n",[]), io:format("> Melihat node yang lain : nodes(). <-- di akhir harus menggunakan titik \'.\'~n~n",[]), io:format("> Mengirim pesan
:
client:message(Nama_yg_dituju,Pesan).~n~n",[]), io:format(" -note : perintah diatas berjalan bila \'Nama_yg_dituju\' dan \'Pesan\'~n",[]), io:format("
hanya satu kata juga diawali dengan huruf kecil.
Jika ingin lebih~n",[]), io:format("
dari satu kata gunakan tanda kutip \"\" pada
\'Nama_yg_dituju\' dan 'Pesan\'~n~n io:format(" io:format("
contoh :",[]),
client:message(ryan,hallo). <-- benar~n",[]), client:message(\"Ryan Ganteng\",\"Haloo
apa kabar??\"). <-- benar~n",[]), io:format("
client:message(Ryan ganteng\\ryan
ganteng,hai apa kabar\\Hai). <-- salah~n~n",[]), io:format("> Untuk logoff
: client:logoff().~n~n",[]),
io:format("<<--------------------------------------------------->>~n",[]).
L 23
End Of File ----------