Apache Mina Introduction

Merhaba arkadaslar,

Apache Mina yazılarına giriş yazımızla başlamış bulunmaktayız. Blogumu az çok takip ediyorsanız yazıların nasıl bir taslak içerdiği hakkında bir fikriniz vardır diye düşünüyorum.  Socket programlama basit olmakla beraber pure java ile yazmadığımız için java ve bazı protokolleri biliyor olmanız gerekmektedir.

Mina nedir? ne için kullanılır? diyerek giriş yazımıza başlayalım;

Apache Mina Project

Mina, Java NIO API’sini kullanarak TCP ve UDP olacak şekilde portlarla haberleşmeyi sağlayan bir yapıdır. Transport(taşıma) işlemi APR üzerinden (Apache Portable Runtime) gerçekleşir. Mina ile birlikte TCP ve UDP dışında kendi implementasyonlarınızı da yazarak transfer tipini ayarlayabilirsiniz. Bu nedenle Apche mina transport-indepented’tir.

Mina ile birlikte Client ve Server applicationlar yazabilir, HTTP gibi text protokollerini handle edebilirsiniz. Ayrıca siz session üzerinden close methodunu açık biçimde çağırmadığınız sürece yada client bağlantıyı kapatmadıkça/connection alive olduğu sürece prokolünüz devam eder.

Mina’nın özellikleri arasında SSL/TSL kullanabilme ve  binary protocol LDAP kullanabilme gibi yetenekler bulunmakta. Dediğim gibi Mina ile HTTP,  XML,  TCP,  LDAP,  DHCP,  NTP,  DNS,  XMPP,  SSH,  FTP gibi protoklleri destekleyen uygulamalar yazabilirsiniz. Socket programlama low development olduğu için merakınız yada ihtiyacınız yoksa sıkılabilirsiniz Yapılar çok karmaşık değil, gözünüz korkmasın. Okudukça, örnek yaptıkça pekişecektir. CV’nizde en azından profesyonel olarak soket programlama yapabileceğinize dair bir özelliğiniz olur

Mina yazılarına başlamadan önce; TCP/IP, UDP(gerekmeyecektir ama ne olduğunu bilmekte fayda var), Session ve orta da olsa core Java bilmeniz gerekmektedir.

Mina, IOHandler ile birlikte session açılıp/kapandığında, mesaj alındığında, transport anında herhangi bir sessionda oluşan hata/exception yakalandığında haberdar olabilir, yazdığınız uygulamaları buna göre şekillendirebilirsiniz.

Mina, temelinde bir server ve client objesi oluşturulduktan sonra filter ile logger, protocol gibi filterlar ekleyebilirsiniz. Bu şu demektir; logger filter ile gelen/giden mesajların loglanması, protocol filter ile haberleşmede kullanılacak protokolün belirlenmesi vs hepsi elinizdedir.

NIO

Mina’nın NIO API ile haberlerşme yaptığından bahsettik. NIO, Java 1.4 ile gelen non-blocking IO yönetim yapısını içermektedir. NIO yanısıra BIO olarak bilinen yada Blocking-IO ise socket üzerinde herhangi bir read/write yada herhangi bir işlemde bloklar ve diğer operasyonlar bunun bitmesini bekler. Bu nedenle NIO, event mantığı ile çalışarak bloklama yapmaz ve ilgilendiği event oluştuğunda devreye girer. NIO, BIO’ya göre daha fazla connection’a destek verebilir ve daha da hızlıdır.

 

Mina Example

Öncelikle simple bir örnek ile soket programlama girelim. Yapacağımız işlem bir soket acceptor oluşturmak ve herhangi bir port’a bind etmek. Socketimiz üzerinde de iki filter tanımı yapacağız. Öncelikle Mina için gerekli jar dosyalarını indirelim ve classpath’e ekleyelim. Bunun için şurayı kullanabilirsiniz; Getting Started

Öncelikle NioSocketAcceptor oluşturalım;

Yukarda örnek bir Socket Acceptor bulunmakta ve 5003 portundan çalışmaktadır. Acceptor üzerinde iki adet filter tanımlanmıştır. Bunlardan biri socket ile ilgili olan işlemlerin default console yazdırılması için “logger” filter ve Protocol olarak text codec olan TextLineCodecFactory kullanmaktayız.  Buraya kadar olan kısmı aşağıdaki kod blogu yapmaktadır.

Daha sonra uygulamamızın business logic kısmıs olan IO handler’ı set ediyoruz. TimeServerHandler classımız IoHandlerAdapter sınıfı extend eden ve socket üzerinde session açılması/kapanması, mesaj alınması/gönderilmesi gibi durumları handle eden logic class’dır.

Daha sonra acceptor üzerinde buffer size ve idle(boşta) zamanı için ayarlamalar yapıyoruz. En son ise acceptor  5003 portuna bind ediliyor ve 5003 portuna gelecek olan bağlantıları dinlemeye geçiyor.

Business logic olan TimeServerHandler sınıfımıza bakalım;

Business logic sınıfımızda bazı eventların oluşması durumunda console ekranına bazı bilgiler yazmaktayız.  Main classımızı çalıştıralım ve telnet ile portumuza erişmeye çalışalım;

Uygulama çalışmaya başladığında 5003 portunu dinlemeye başlar ve gelen sessionları handle etmeye hazır durumdadır;

Screenshot from 2015-11-30 23:28:07

5003 protuna bağlandımızda consola bakalım;

Screenshot from 2015-11-30 23:29:09

Bir mesaj gönderelim, mesajımız “Hi, Mina!” olsun Consola bakalım daha sonra;

Screenshot from 2015-11-30 23:16:56

Mesajın alındığını ve consola yazdırıldığını görebilmekteyiz. İdle time olarak 10 sn vermiştik bu zaman süresinde sessiondan/client’dan herhangi bir mesaj gelmezse IDLE diye mesaj yazmaktayız. Bağlanan session bilgisini de yine yukardan görebiliriz. Yeni bir mesaj gönderelim;

hello

Gelen mesajı yeniden görebildik. Unix terminalden şu komutu girerek  netstat -tulpn 5003 portunun bilgisini alalım;

Screenshot from 2015-11-30 23:26:14

5003 portunun dinlendiğini tcp ile transmit yapıldığını görebilmekteyiz.

Giriş yazımız için bir server socket örneği yaptık arkadaşlar. Bir sonraki yazıda yazdığımız server socket için client yaıyor olacağız. Daha sonra kendi Protocol’ümüzü yazmayı  ve birkaç ek özellikleri göreceğiz insaAllah.

Örnek uygulamanın yapısı aşağıdaki gibidir, indirme linkini de şuradan bulabilirsiniz.

Bir sonraki yazıda görüşmek dileğiyle, mutlu kalın, kod’la kalın ve bol bol Çay için

~ Alican Akkus

 

1423 Total Views 1 Views Today