Erlang - Limanlar
Erlang'da, portlar farklı programlar arasında iletişim için kullanılır. Soket, makinelerin İnternet Protokolünü (IP) kullanarak İnternet üzerinden iletişim kurmasını sağlayan bir iletişim uç noktasıdır.
Bağlantı Noktalarında Kullanılan Protokol Türleri
İletişim için mevcut 2 tip protokol vardır. Biri UDP ve diğeri TCP'dir. UDP, uygulamaların birbirine kısa mesajlar (datagram adı verilir) göndermesine izin verir, ancak bu mesajlar için teslim garantisi yoktur. Ayrıca sıra dışı da gelebilirler. Öte yandan TCP, bağlantı kurulduğu sürece sırayla teslim edilen güvenilir bir bayt akışı sağlar.
UDP kullanarak bir bağlantı noktası açmanın basit bir örneğine bakalım.
Misal
-module(helloworld).
-export([start/0]).
start() ->
{ok, Socket} = gen_udp:open(8789),
io:fwrite("~p",[Socket]).
Yukarıdaki program hakkında aşağıdaki hususlara dikkat edilmesi gerekir
gen_udp UDP iletişimi için kullanılan Erlang'daki modülleri içerir.
Burada 8789, Erlang'da açılan port numarasıdır. Bu bağlantı noktası numarasının mevcut olduğundan ve kullanılabilir olduğundan emin olmanız gerekir.
Yukarıdaki programın çıktısı -
#Port<0.376>
Limanda Mesaj Gönderme
Bağlantı noktası açıldıktan sonra, bağlantı noktasına bir mesaj gönderilebilir. Bu, gönderme yöntemi ile yapılır. Söz dizimine ve aşağıdaki örneğe bakalım.
Sözdizimi
send(Socket, Address, Port, Packet)
Parametreler
Socket - Bu, gen_udp: open komutuyla oluşturulan sokettir.
Address - Bu, mesajın gönderilmesi gereken makine adresidir.
port - Bu, mesajın gönderilmesi gereken port numarasıdır.
Packet - Bu, gönderilmesi gereken paket veya mesaj ayrıntılarıdır.
Dönen Değerler
Mesaj düzgün gönderildiyse bir ok mesajı döndürülür.
Örneğin
-module(helloworld).
-export([start/0]).
start() ->
{ok, Socket} = gen_udp:open(8789),
io:fwrite("~p",[Socket]),
io:fwrite("~p",[gen_udp:send
(Socket,"localhost",8789,"Hello")]).
Çıktı
Yukarıdaki programın çıktısı aşağıdaki gibi olacaktır.
#Port<0.376>ok
Limanda Mesaj Almak
Bağlantı noktası açıldıktan sonra, bağlantı noktasından bir mesaj da alınabilir. Bu, aracılığıyla yapılırrecv method. Söz dizimine ve aşağıdaki örneğe bakalım.
Sözdizimi
recv(Socket, length)
Parametreler
Socket - Bu, gen_udp: open komutuyla oluşturulan sokettir.
Length - Bu, alınması gereken mesajın uzunluğudur.
Dönen Değerler
Mesaj düzgün gönderildiyse bir ok mesajı döndürülür.
Örneğin
-module(helloworld).
-export([start/0]).
start() ->
{ok, Socket} = gen_udp:open(8789),
io:fwrite("~p",[Socket]),
io:fwrite("~p",[gen_udp:send(Socket,"localhost",8789,"Hello")]),
io:fwrite("~p",[gen_udp:recv(Socket, 20)]).
Tam Program
Açıkçası, aynı programda aynı gönderme ve alma mesajına sahip olamayız. Bunları farklı programlarda tanımlamanız gerekir. Öyleyse, mesajları dinleyen bir sunucu bileşeni ve mesaj gönderen bir istemci bileşeni oluşturan aşağıdaki kodu oluşturalım.
Misal
-module(helloworld).
-export([start/0,client/1]).
start() ->
spawn(fun() -> server(4000) end).
server(Port) ->
{ok, Socket} = gen_udp:open(Port, [binary, {active, false}]),
io:format("server opened socket:~p~n",[Socket]),
loop(Socket).
loop(Socket) ->
inet:setopts(Socket, [{active, once}]),
receive
{udp, Socket, Host, Port, Bin} ->
io:format("server received:~p~n",[Bin]),
gen_udp:send(Socket, Host, Port, Bin),
loop(Socket)
end.
client(N) ->
{ok, Socket} = gen_udp:open(0, [binary]),
io:format("client opened socket=~p~n",[Socket]),
ok = gen_udp:send(Socket, "localhost", 4000, N), Value = receive
{udp, Socket, _, _, Bin} ->
io:format("client received:~p~n",[Bin]) after 2000 ->
0
end,
gen_udp:close(Socket),
Value.
Yukarıdaki programla ilgili olarak aşağıdaki noktalara dikkat edilmelidir.
2 fonksiyon tanımlıyoruz, ilki sunucu. Bu, 4000 portunu dinlemek için kullanılacaktır. İkincisi, sunucu bileşenine "Merhaba" mesajını göndermek için kullanılacak istemcidir.
Alma döngüsü, bir tanımlama döngüsü içinde gönderilen mesajları okumak için kullanılır.
Çıktı
Şimdi programı 2 pencereden çalıştırmanız gerekiyor. İlk pencere, aşağıdaki kodu çalıştırarak sunucu bileşenini çalıştırmak için kullanılacaktır.erl command line window.
helloworld:start().
Bu, komut satırı penceresinde aşağıdaki çıktıyı gösterecektir.
server opened socket:#Port<0.2314>
Şimdi ikinci erl komut satırı penceresinde aşağıdaki komutu çalıştırın.
Helloworld:client(“<<Hello>>”).
Bu komutu verdiğinizde, aşağıdaki çıktı ilk komut satırı penceresinde görüntülenecektir.
server received:<<"Hello">>