Merhabalar ben saldırı timlerinden Bunjo, bu konuda Asenkron Programlama'nın ne olduğunu anlatacağım.
Asenkron Programlama
Asenkron programlama, bir bilgisayar programının işlemlerinin belirli bir sıraya bağlı olmadan eşzamansız bir şekilde gerçekleştirildiği bir programlama paradigmadır. Bu, bir işlem başlamadan önce diğer işlemlerin tamamlanmasını beklemek zorunda olmadığı anlamına gelir. Asenkron programlama genellikle I/O yoğun uygulamalarda ve kullanıcı arayüzü etkileşimlerinde yaygın olarak kullanılır.
Geleneksel olarak, programlar adım adım, sıra ile çalışırlar. Bir adım tamamlanmadan bir sonraki adıma geçilemez. Ancak asenkron programlama, işlemlerin birbirinden bağımsız olarak çalıştığı ve bir işlemin tamamlanmasını beklerken diğer işlemlerin devam edebildiği bir model sunar. Bu, özellikle zaman alıcı işlemlerle başa çıkmak, performansı artırmak ve daha etkili bir şekilde kaynakları kullanmak için önemlidir.
Asenkron programlama genellikle olay tabanlı programlamayla birleştirilir. Bu, bir olayın gerçekleştiğinde belirli bir işlemin tetiklenmesini sağlar. Asenkron yapılar genellikle callback fonksiyonları veya promise/async-await gibi mekanizmaları içerir.
EventMachine Nedir?
EventMachine, Ruby dilinde geliştirilen bir asenkron I/O ve ağ kütüphanesidir. Bu kütüphane, özellikle ağ programlaması ve asenkron işlemlerle uğraşan geliştiriciler için tasarlanmıştır.
EventMachine, Ruby programları arasında olay tabanlı (event-driven) programlamaya olanak tanıyan bir çerçeve sağlar.
Rich (BB code):
gem install eventmachine em-websocket
Komutu ile kütüphane kurulumunu yapabilirsiniz.
TCP Sunucusu:
Ruby:
require 'eventmachine'
module TCPServerExample
def post_init
puts "Yeni bir bağlantı geldi!"
end
def receive_data(data)
puts "Alınan veri: #{data}"
send_data "Merhaba, #{data}"
end
def unbind
puts "Bağlantı kapatıldı!"
end
end
EventMachine.run do
EventMachine.start_server '0.0.0.0', 1234, TCPServerExample
puts "TCP Sunucusu başlatıldı, 1234 portunu dinliyor."
end
require 'eventmachine': EventMachine kütüphanesini projeye dahil eder.
module TCPServerExample: TCPServerExample adında bir modül tanımlar. Bu modül, EventMachine'in start_server fonksiyonu tarafından çağrılacak ve TCP sunucusu olaylarına yanıt verecek olan metodları içerir.
def post_init: Yeni bir bağlantı kurulduğunda çağrılan bir metoddur. Bu metod, bağlantı kurulduğunda ekrana bir mesaj yazdırır.
def receive_data(data): Veri alındığında çağrılan bir metoddur. Alınan veriyi ekrana yazdırır ve aynı veriyi geri gönderir.
def unbind: Bağlantı kapatıldığında çağrılan bir metoddur. Bağlantı kapatıldığında ekrana bir mesaj yazdırır.
EventMachine.run do: EventMachine'i başlatan bir blok başlatır.
EventMachine.start_server '0.0.0.0', 1234, TCPServerExample: EventMachine'in start_server fonksiyonu kullanılarak bir TCP sunucusu başlatılır. Sunucu, '0.0.0.0' adresini ve 1234 portunu dinler. Olayları işlemek için TCPServerExample modülü kullanılır.
puts "TCP Sunucusu başlatıldı, 1234 portunu dinliyor.": Sunucunun başlatıldığına dair bir mesajı ekrana yazdırır.
TCP Clienti:
Ruby:
require 'eventmachine'
module TCPClientExample
def post_init
send_data "Merhaba, TCP Sunucusu!"
end
def receive_data(data)
puts "Alınan cevap: #{data}"
close_connection
end
end
EventMachine.run do
EventMachine.connect '127.0.0.1', 1234, TCPClientExample
end
require 'eventmachine': EventMachine kütüphanesini projeye dahil eder.
module TCPClientExample: TCPClientExample adında bir modül tanımlar. Bu modül, EventMachine'in connect fonksiyonu tarafından çağrılacak ve TCP istemci olaylarına yanıt verecek olan metodları içerir.
def post_init: Bağlantı kurulduğunda çağrılan bir metoddur. Bu metod, bağlantı kurulduktan hemen sonra sunucuya "Merhaba, TCP Sunucusu!" mesajını gönderir.
def receive_data(data): Veri alındığında çağrılan bir metoddur. Alınan cevabı ekrana yazdırır ve bağlantıyı kapatır (close_connection).
EventMachine.run do: EventMachine'i başlatan bir blok başlatır.
EventMachine.connect '127.0.0.1', 1234, TCPClientExample: EventMachine'in connect fonksiyonu kullanılarak bir TCP istemcisi başlatılır. İstemci, '127.0.0.1' IP adresini ve 1234 portunu kullanarak belirtilen sunucuya bağlanır. Olayları işlemek için TCPClientExample modülü kullanılır.
Kullanım:
UDP Sunucusu:
Ruby:
require 'eventmachine'
module UDPServerExample
def post_init
puts "UDP sunucusu başlatıldı, 12345 portunu dinliyor."
end
def receive_data(data, sender_info)
puts "Alınan UDP verisi: #{data} - Gönderen: #{sender_info[2]}, Port: #{sender_info[1]}"
send_data "Merhaba, #{data}", sender_info[2], sender_info[1]
end
end
EventMachine.run do
EventMachine.open_datagram_socket '0.0.0.0', 12345, UDPServerExample
end
require 'eventmachine': EventMachine kütüphanesini projeye dahil eder.
module UDPServerExample: UDPServerExample adında bir modül tanımlar. Bu modül, EventMachine'in open_datagram_socket fonksiyonu tarafından çağrılacak ve UDP sunucusu olaylarına yanıt verecek olan metodları içerir.
def post_init: UDP sunucusu başlatıldığında çağrılan bir metoddur. Bu metod, sunucunun başlatıldığına dair bir mesajı ekrana yazdırır.
def receive_data(data, sender_info): Veri alındığında çağrılan bir metoddur. Alınan UDP verisini ve gönderenin bilgilerini ekrana yazdırır. Ardından, göndereni bulunduğu adres ve port üzerinden "Merhaba, #{data}" mesajı ile yanıt verir.
EventMachine.run do: EventMachine'i başlatan bir blok başlatır.
EventMachine.open_datagram_socket '0.0.0.0', 12345, UDPServerExample: EventMachine'in open_datagram_socket fonksiyonu kullanılarak bir UDP sunucusu başlatılır. Sunucu, '0.0.0.0' adresini ve 12345 portunu dinler. Olayları işlemek için UDPServerExample modülü kullanılır.
UDP Client:
Ruby:
require 'eventmachine'
module UDPClientExample
def post_init
send_datagram "Merhaba, UDP Sunucusu!", '127.0.0.1', 12345
end
def receive_data(data)
puts "Alınan cevap: #{data}"
EventMachine.stop
end
end
EventMachine.run do
EventMachine.open_datagram_socket '0.0.0.0', nil, UDPClientExample
end
require 'eventmachine': EventMachine kütüphanesini projeye dahil eder.
module UDPClientExample: UDPClientExample adında bir modül tanımlar. Bu modül, EventMachine'in open_datagram_socket fonksiyonu tarafından çağrılacak ve UDP istemci olaylarına yanıt verecek olan metodları içerir.
def post_init: İstemci başlatıldığında çağrılan bir metoddur. Bu metod, istemcinin başlatıldığına dair bir mesajı sunucuya gönderir.
def receive_data(data): Veri alındığında çağrılan bir metoddur. Alınan cevabı ekrana yazdırır ve EventMachine'i durdurur (EventMachine.stop).
EventMachine.run do: EventMachine'i başlatan bir blok başlatır.
EventMachine.open_datagram_socket '0.0.0.0', nil, UDPClientExample: EventMachine'in open_datagram_socket fonksiyonu kullanılarak bir UDP istemcisi başlatılır. İstemci, '0.0.0.0' adresini ve herhangi bir portu kullanarak dinler. Olayları işlemek için UDPClientExample modülü kullanılır.
Zamanlanmış Görev Örneği:
Ruby:
require 'eventmachine'
module TimerExample
def post_init
puts "Zamanlanmış görev başlatıldı!"
EventMachine.add_periodic_timer(5) { send_data "Zamanlanmış görev çalıştı!\n" }
end
end
EventMachine.run do
EventMachine.connect '127.0.0.1', 1234, TimerExample
end
require 'eventmachine': EventMachine kütüphanesini projeye dahil eder.
module TimerExample: TimerExample adında bir modül tanımlar. Bu modül,
EventMachine'in connect fonksiyonu tarafından çağrılacak ve zamanlanmış görevi gerçekleştirecek olan metodları içerir.
def post_init: Bağlantı kurulduğunda çağrılan bir metoddur. Bu metod, bağlantı kurulduğunda ekrana bir başlangıç mesajı yazdırır ve add_periodic_timer fonksiyonunu kullanarak bir zamanlanmış görev ekler. Bu görev, her 5 saniyede bir belirtilen kod bloğunu çlıştırarak sunucuya "Zamanlanmış görev çalıştı!" mesajını gönderir.
EventMachine.run do: EventMachine'i başlatan bir blok başlatır.
EventMachine.connect '127.0.0.1', 1234, TimerExample: EventMachine'in connect fonksiyonu kullanılarak bir istemci başlatılır. İstemci, '127.0.0.1' IP adresini ve 1234 portunu kullanarak belirtilen sunucuya bağlanır. Olayları işlemek için TimerExample modülü kullanılır.
Web Soket (WebSocket) Sunucusu:
gem install em-websocket
Ruby:
require 'eventmachine'
require 'em-websocket'
module WebSocketServer
def post_init
puts "WebSocket Sunucusu başlatıldı!"
end
def on_message(msg)
puts "Alınan WebSocket mesajı: #{msg}"
send(msg)
end
end
EventMachine.run do
EventMachine::WebSocket.start(host: '0.0.0.0', port: 8080) do |ws|
ws.onopen { puts "WebSocket bağlantısı açıldı!" }
ws.onmessage { |msg| ws.on_message(msg) }
ws.onclose { puts "WebSocket bağlantısı kapatıldı!" }
end
puts "WebSocket Sunucusu başlatıldı, 8080 portunu dinliyor."
end
require 'eventmachine': EventMachine kütüphanesini projeye dahil eder.
require 'em-websocket': em-websocket kütüphanesini projeye dahil eder. Bu kütüphane, WebSocket protokolü üzerinden iletişim kurmayı sağlar.
module WebSocketServer: WebSocketServer adında bir modül tanımlar. Bu modül, EventMachine'in WebSocket kütüphanesi tarafından kullanılacak ve WebSocket olaylarına yanıt verecek olan metodları içerir.
def post_init: WebSocket sunucusu başlatıldığında çağrılan bir metoddur. Bu metod, sunucunun başlatıldığına dair bir mesajı ekrana yazdırır.
def on_message(msg): WebSocket üzerinden bir mesaj alındığında çağrılan bir metoddur. Bu metod, alınan mesajı ekrana yazdırır ve aynı mesajı gönderir (send(msg)).
EventMachine.run do: EventMachine'i başlatan bir blok başlatır.
EventMachine::WebSocket.start(host: '0.0.0.0', port: 8080) do |ws|: EventMachine'in WebSocket sunucu özelliğini başlatır. Sunucu, '0.0.0.0' adresini ve 8080 portunu dinler. Her yeni bağlantı için bir WebSocket nesnesi oluşturulur ve verilen blok içindeki olayları işler.
ws.onopen { puts "WebSocket bağlantısı açıldı!" }: Bir WebSocket bağlantısı açıldığında çağrılan bir olaydır. Bu olay, bağlantının açıldığına dair bir mesajı ekrana yazdırır.
ws.onmessage { |msg| ws.on_message(msg) }: Bir WebSocket mesajı alındığında çağrılan bir olaydır. Bu olay, alınan mesajı on_message metoduna ileterek işlemi başlatır.
ws.onclose { puts "WebSocket bağlantısı kapatıldı!" }: Bir WebSocket bağlantısı kapatıldığında çağrılan bir olaydır. Bu olay, bağlantının kapatıldığına dair bir mesajı ekrana yazdırır.
puts "WebSocket Sunucusu başlatıldı, 8080 portunu dinliyor.": Sunucunun başlatıldığına dair bir mesajı ekrana yazdırır.
HTTP Sunucusu:
gem install em-http-server
Ruby:
require 'eventmachine'
require 'em-http-server'
class HTTPServer < EM::HttpServer::Server
def process_http_request
response = EM::DelegatedHttpResponse.new(self)
response.status = 200
response.content_type 'text/html'
response.content = 'Merhaba, HTTP Sunucusu!'
response.send_response
end
end
EventMachine.run do
EventMachine.start_server '0.0.0.0', 8081, HTTPServer
puts "HTTP Sunucusu başlatıldı, 8081 portunu dinliyor."
end
require 'eventmachine': EventMachine kütüphanesini projeye dahil eder.
require 'em-http-server': em-http-server kütüphanesini projeye dahil eder. Bu kütüphane, EventMachine ile entegre bir HTTP sunucu sağlar.
class HTTPServer < EM::HttpServer::Server: HTTPServer adında bir sınıf tanımlar ve bu sınıf, EM::HttpServer::Server sınıfından türetilir. Bu sınıf, HTTP sunucusunu temsil eder ve isteklere yanıt vermek için gerekli metodları içerir.
def process_http_request: HTTP isteği işleyen bir metodur. Bu metod, bir EM:: DelegatedHttpResponse nesnesi oluşturarak isteğe yanıt verir. Yanıt durumu (status) 200 olarak ayarlanır, içerik tipi 'text/html' olarak ayarlanır ve içerik olarak 'Merhaba, HTTP Sunucusu!' metni atanır. Ardından yanıt gönderilir (response.send_response).
EventMachine.run do: EventMachine'i başlatan bir blok başlatır.
EventMachine.start_server '0.0.0.0', 8081, HTTPServer: EventMachine'in start_server fonksiyonu kullanılarak bir HTTP sunucusu başlatılır. Sunucu, '0.0.0.0' adresini ve 8081 portunu dinler. Olayları işlemek için HTTPServer sınıfı kullanılır.
puts "HTTP Sunucusu başlatıldı, 8081 portunu dinliyor.": Sunucunun başlatıldığına dair bir mesajı ekrana yazdırır.
Github
Emeğe karşılık konuyu beğenip mesaj atabilirsiniz.
Okuyan herkese teşekkür ederim.
İyi forumlar.