Saka 1.0
Yazarımız Serkan Alımcı kendi yazdığı ve oldukça hızlı çalışan bir FTP istemcisi ve suncusu ile karşınızda. Program Java dili kullanılarak yazılmış…
Yaklaşık bir buçuk sene önce vermiş olduğum bir sözü bugün yerine getirmekten dolayı mutluyum. Böyle bir Türkçe bilgi paylaşım ortamın eksikliğini çok zaman bizim kültüre has söylenerek dile getirmiş olsam da, bu ortamların korunması ve desteklenmesi aşamasında üzerimdeki tembelliği atıp biraz olsun katkı sağlayabilirsem ne mutlu bana.
Saka programı evde FTP'den çektiğim sıkıntı sırasında aklıma gelen ve kullanımı FTP'ye oldukça benzeyen bir program. Masa üstü bilgisayarla diz üstünü birbirine bağladığımda elimde cygwin ve açık kaynak yayımlanan ProFTP Sunucusu mevcuttu ve iki bilgisayar arası dosya aktarımı sırasında özellikle dizinleri aktarmak sorun yaratıyordu. Yine ücretsiz grafik arayüze sahip ve oldukça kullanışlı istemci FTP programları olsa da kararım kendi isteklerime uygun FTP'ye oldukça benzeyen bir program yazmak oldu.
Her ne kadar kullanımı FTP iletişim kuralını (protokol) gerçekleştirenlere benzese de tamamıyla farklı bir iletişim kuralına sahip. Tabi bu nedenle, sadece bu programın sunucu/istemci ikilisini kullananlar faydalanabilirL
İsmini bulmak konusunda biraz zorlandım, Türkçe konuşan bir kümede(site tabi kiJ ismi Türkçe olmalıydı ve aklıma ilk gelende karar kıldım. Sonuçta bir yerden bir yere birşey taşıyan birşeydi bu, birşey su olunca Saka deniyorsa dosya olması anlamına sadakatsizlik olmaz gibi geldi ve bu ismi koymaya karar verdim.
Özellikler
Saka programı tamamıyla Java 1.4.2 kullanılarak yazıldı ve işletim sistemlerinde Java 1.4.2 Sanal Makinasına sahip herkes kullanabilir. Ayrıca kaynağı da açık, isteyen istediği gibi değiştirebilirJ Henüz java ile tanışmadıysanız bir an önce tanışın, özellikle bu türden ağ iletişim programları için oldukça hızlı bir şekilde kafanızdakileri gerçekleştirebilme olanaklarına sahip.
Sistem temelde iki ana birimden oluşuyor. İstemci ve Sunucu. Sunucu programı erişilmek istenen dosya sistemine açılan kapıda bekleyen program. Tek görevi istemcilerden gelecek isteklere cevap vermek. İstemciler ise sunucunun üzerinde çalıştığı sisteme ulaşabilmek için kullanacağınız yardımcınız. Yazarken ne ölçüde detaya girip girmeme konusunda tam olarak okuyucuların birikim durumlarını bilmediğimden bazıları için oldukça basit ve sıkıcı gelebilir, onlar için şu an yapabilecek birşey yok, ama yeni başlayanlar için de belki bazıları biraz havada kalıyor olabilir. İkisinin arası arasındaki yer hakkında ise şu an en ufak bir fikrim yok, bu nedenle söyleyeyim, sürçü lisan ettimse ya da edersem affolaJ Aşağıda sistemin bir resmini çizmeye çalıştım.
Şekilden de görüldüğü gibi sunucu ve istemci karşılıklı işletim sistemlerindeki dosya sistemlerini birbirine bağlama görevini yerine getirir. Sunucu, aynı anda, sunucu üzerindeki kaynaklar yeterli olduğu ölçüde istemciye servis sağlayabilir. Ev kullanımı için tasarladığım için üzerinde herhangi bir güvenlik yok, istemci bağlandığı anda sunucu üzerinde çalıştığı sistemin dosya sistemini istemciye açar.
Sunucu programı şu şekilde başlatılır
java Server <server port> <başlangıç dizini>
Evet kabul ediyorum bu noktada çelişkiye düştüm kendimle. Yılların getirdiği alışkanlıkla bütün programda kullanılan isimler (yöntem ve değişkenler de dahil) İngilizce ama zamanla düzelecek, evrim kaçınılmaz olarak bunları elemek zorundaJ Neyse, yukarda programın ilk değiştirgesi (parametre) olan server port, sunucu programının gelen istekleri kabulde kullandığı port numarası (bir nevi her istemcinin bu sunucunun nimetlerinde faydalanabilmek için bilmek zorunda olduğu kapı numarası), başlangıç dizini ise, bir istemci sunucuya bağlandıktan sonra karşı sistemde göreceği ilk dizin. Örneğin benim evdeki bilgisayarda standart FTP sunucusu bulunmadığı için (artık tarihi nedenlerle bir standart olarak kabul edilmiş olan) 21 numaralı portu sunucu portu olarak kullanıyorum ve istemcilerin ilk olarak D: ‘den dolaşmaya başlamalarını istiyorum. Bunun için
java Server 21 D:
demek yapılabilecek tek şeyJ Burada örnek olarak DOS'u kullanıyorum fakat Linux/Unix kullanıcıları için değişen tek şey dizinlerin gösterimleri
Bir sunucu çalışmaya başladıktan sonra aynı dili kullanan herhangi bir istemci artık bağlantı kurabilir. İstemci program şu şekilde başlatılır
java Client <sunucu IP veya isim> <sunucu portu>
Bu komutla istemci programı <sunucu IP veya isim> alanında bulunan bilgisayarın <port>'ta verilen portuna bağlantı kurmaya çalışır. Örneğin
java Client 10.0.0.2 21
komutu ile biraz önce sunucuyu başlattığım makinaya bağlanarak artık karşı sisteme komutlar gönderebilirim.
İstemci başarıyla bağlantıyı kurduktan sonra tıpkı kullanılan kabuk programa benzer bir komut satırı çıkar. Örneğin yukardaki örnek için
D:>_
FTP'ye alışkın olmayanlar bu noktada şaşırmasınlar. Bu dizin sizin kullandığınız sistemdeki dizin değil bağlı olduğunuz sistemde nerde bulunduğunuzu gösteriyor. Aman dikkatJ
İstemci programında iki tip komut bulunmaktadır. Bir tanesi sunucu ile konuşmakta kullanılan komutlar ve bir diğeri de istemcinin kendi bilgisayarındaki dosya sistemi yönetiminde kullanacağı komutlar.
Sunucu Komutları
Saka, kullanıcının en temel dosya işlemlerine cevap verecek komutları kullanmaktadır. Bunlar dosya ve dizin işlemleridir. Bu noktada bir not daha, sunucu komutları büyük küçük harflere duyarlıdır. Örneğin get ve Get komutları aynı değildir.
Dosya veya dizin isimlerinde eğer boşluk karakteri geçiyorsa bu karakterler kullanılarak belirtilmelidir. Aksi takdirde bu boşluklar arasındaki her bir kelime istemci tarafından dosya veya dizin ismi olarak algılanacaktır.
FTP'ye ek olarak gelen bir özellik ise bir dosyayı sunucudan alırken veya sunucuya atarken ismi değiştirilebilir. Bu durum komutların açıklamalarında örnek olarak gösterilecek, fakat şimdiden hatırda kalması için > işareti bu işlem için kullanılır. Yalnız > kullanırken dikkatli olmakta fayda var, çünkü bu karaketer bir isim bittikten hemen sonra başlamalı ve bir sonraki yeni isim için verilen kelimeden de hemen önce, yani sağ ve sol yanında bir ismin son harfi ile diğerinin ilk harfi olacak. AA>CF gibi, arada boşluk vs koymayın.
get: Sunucu dosya sistemindeki bir dosyayı istemcinin o an bulunduğu dizine aktarmak için kullanılır.
get <dosya ismi>
Örneğin, C:Windowstmp test.log dosyasını sunucudan almak için
get C:Windowstmp test.log (tmp test.log'da karakterini aradaki boşluğu işaretlemek için kullanıyoruz, yoksa dizin ayracı değil)
Eğer ben aynı dosyayı alıp D:tmp'nin altında incele.log olarak tutmak istiyorsam bunu otomatik olarak şu şekilde yaptırabilirim
get C:Windowstmp test.log>D:tmpincele.log
Burada da > işaretinin sağ ve sol yanında boşluk olmadığına dikkatinizi çekmek istiyorum.
get komutu sırasında eğer almaya çalıştığınız dosya zaten aktarmaya çalıştığınız yerde varsa size
bu dosyayı alıp almak istemediğinize dair bir soru sorulur. mget'te buna daha detaylı olarak değinmeye çalışacağım.
mget: Sunucu dosya sistemindeki bir veya daha fazla sayıdaki dosyayı ve/veya bir veya daha fazla sayıdaki dizini istemcinin o an bulunduğu dizine aktarmak için kullanılır. Bu noktada standart FTP istemcilerinden farklı olarak dizinler içindeki alt dizinler Saka'da otomatik olarak yaratılır. Yani tek yapmanız gereken komutla almak istediğiniz dizin(ler) ve dosya(lar) belirtmek.
mget [dosya dizin isimleri]
Dizinler için bir noktayı açıklamakta fayda var. Eğer dizin mutlak bir dizin ismi yapısındaysa (Örneğin C:Windows gibi, /home/saka gibi) aynen girildiği gibi istemcinin dosya sisteminde yaratılır. Eğer göreceli ise, bu durumda istemcinin o an çalışmakta bulunduğu yerel dizine göre işlem yapılır. İşte bu noktada yine > oldukça işinize yarayabilir. Örnek bir komut
mget C:Resimler D:mp3>E:MüzikTurkce D:odevodev1.doc
Yukardaki komut sunucu üzerindeki C:Resimler dizinini olduğu gibi bütün alt dizinleri ile birlikte istemcinin C:Resimler dizinine aktarır. Daha önce bahsedildiği gibi C:Resimler mutlak bir isimlendirmedir ve bu nedenle istemciye de aynı şekilde taşınır. D:mp3 dizini ise D:mp3 altına değil de E:MüzikTurkce olarak alınmak istenmiş. D:odevodev1.doc dosyası da yine istemcinin o an kullanmakta olduğu dizinin altına kopyalanır. Burada belki dikkatinizi çekmiştir. Mutlak isimlendirme yalnızca dizinler taşınırken anlam taşır.
Herhangi bir dosya sunucudan istemciye aktarılırken eğer o dosya tam aktarılacak yerde mevcutsa istemci kullanıcıyı uyarararak 4 seçenek sunar. Bu seçenekler
- Evet (e) : Dosyanın üzerine yazılabileceğini belirtir
- Tümüne Evet (E): Tüm mget komutu boyunca aktarılacak dosya var olsa tekrar sormak yerine Evet denildiğini farzeder
- Hayır (h): Sunucudan dosyayı indirmez
- Tümüne Hayır(H): Genelde bir çok programda bulunmayan bu seçenek de kimi zaman işinizi kolaylaştırabilir. Bu komut ile tüm mget komutu boyunca aktarılacak dosya var olsa bile tekrar sormak yerine kullanıcı tarafından Hayır denildiği farzedilerek yerel sistemdeki dosya korunur.
get ve mget komutları sunucudan istemciye dosya ve dizin aktarım işlemlerini yapıyor. Peki istemciden sunucuya dosya ve dizinleri nasıl göndereceğiz? İşte cevabıJ Aşağıda sırasıyla belirtilen put ve mput komutları get ve mget komut yapısı ile birebir aynıdır fakat tek farkı bu sefer istemciden sunucuya aktarım yapılır.
put: İstemcinin dosya sistemindeki bir dosyayı sunucuda o an bulunduğunuz dizine aktarır. (Bu dizin ekranda komut satırında gördüğünüz dizindir)
put <dosya ismi>
Örneğin elimdeki bir winzip.log dosyasını sunucuya aktarmak için
put winzip.log
Yine > dosyayı aktarırken ismini değiştirmek için kullanılabilir. Örneğin
put winzip.log>D:LoglarProgramwinzip_son.log
mput: mput komutu aynen mget komutu gibi bir veya daha fazla sayıdaki dosya/dizini sunucuya aktarmak için kullanılır.
mput [dosya dizin listesi]
pwd: Sunucuda bulunan dosya sisteminde o an nerede bulunduğunuz her ne kadar komut satırında yazıyor olsa da pwd komutu ile onu ekrana yazdırabilirsiniz. Bunu aslında bir şekilde iletişim kuralı bozulursa son hali tekrar elde etmek amaçlı koydum, umarım kimse ihtiyaç duymaz.
cd: Sunucu dosya sistemi üzerinde dizinlerde gezinmek için bu komut kullanılır.
cd <dizin ismi>
Komut başarıyla tamamlanınca ekranda komut satırında yeni dizini göreceksiniz
ls (ya da dır): ls veya dır komutu ile bir veya daha fazla sayıdaki dizinin içeriğini görüntüleyebilirsiniz. Eğer hiçbir değiştirge(TDK'nın parametre için önerdiği kelime, bana da garip geliyor ama herşey zamanla, hemen eleştirmeyinJ) vermezseniz o an sunucuda bulunduğunuz dizinin içeriği görüntülenir.
ls [dizin dosya listesi]
dır [dizin dosya listesi]
İçerik bilgisi olarak sadece dosya mı dizin mi ve eğer dosya ise boyutu ne kadar görüntülenmektedir.
mkdır (ya da mk): Sunucu dosya sistemi üzerinde dizin ya da dizinler oluşturmak için kullanılır.
mkdır [dizin listesi]
mk [dizin listesi]
rmdır: Sunucu dosya sistemi üzerinde dizin ya da dizinleri silmek için kullanılır
rmdır [dizin listesi]
rm: Sunucu dosya sistemi üzerinde dosya ya da dosyaları silmek için kullanılır
rm [dosya listesi]
mv: Sunucu dosya sistemi üzerindeki bir dosya veya dizinin ismini değiştirmek veya dosya ve/veya dizinleri başka dizine taşımak için kullanılır. Örneğin bir dosyayı C:Windows'tan alıp D:tmp'ye taşımak gibi
mv [Taşınacak dosya dizin(ler)] [yeni dizin veya isim]
İstemci Komutları
Sunucu tarafindaki komutların yanında istemci tarafında da ihtiyaç duyulan benzer komutlar mevcuttur. Örneğin kullanıcı istemcide çalışmakta olduğu aktif dizini değiştirmek, nerde olduğunu görmek gibi ihtiyaçları olabilir. Yine Standard FTP istemcilerinde de olduğu gibi işletim sisteminin kabuk programına (Windows tabanlı sistemlerde DOS, Unix tabanlılarda ksh, bash gibi) ulaşmak isteyebilir. Saka'nın kullanıcıya sunduğu istemci komutları da yaklaşık bir FTP istemcisinin sağladıklarına yakındır.
Bütün istemci komutları ! işareti ile başlar. Eğer ! işareti tek başına kullanılırsa, bu kabuk programına geçme isteğini belirtir.
!: Bu komut ile kullanıcı istemci işletim sisteminde kullanmak üzere seçtiği kabuk programına ulaşır. Bu amaçla kabuk.prp dosyası kullanılır. Eğer bu dosya mevcut değilse veya içerisinde gerekli tanım bulunamazsa bu komut kullanıcı tarafından kullanılamaz. Ben testlerde "cmd"yi kullandım ve bu amaçla hazırladığım kabuk.prp dosyası
KABUK=cmd
İfadesinden ibaret. ! komutunu çalıştırdığınız anda karşınıza istemiş olduğunuz kabuk yorumlayıcısı gelir. Testler sırasında DOS'u java içerisinden yarattığımda ufak tefek bir takım sorunlarla karşılaştım. Bunlar DOS'a komut geçtikten sonra yazdığım komutun ekranda "echo" yapması ve çıkarken exit yazdıktan sonra ikinci kez "Enter" tuşuna basmak zorunda kalışım. Henüz sebebebini bulabilmiş değilimL Ancak fazlasıyla işimi görecek yeterlilikte.
!pwd: İstemci programın o an çalışmakta olduğu yerel dizini gösterir. Daha önce de bahsi geçen bu dizin, göreceli dizin ismi çözmede kendisinden referans alınan noktadır.
!pwd
!ls (ya da !dır): İstemci dosya sistemi üzerinde dizin içerikleri dosya özelliklerini listelemekte kullanılır. Eğer herhangi bir değiştirge verilmezse o an aktif olan yerel çalışma dizinin içeriği listelenir(yani !pwd ile görüntülenen dizin)
!ls [dizin veya dosya isimleri]
!dır [dizin veya dosya isimleri]
!cd: İstemci dosya sisteminde dizin değiştirmek için kullanılır.
!cd [yeni dizin ismi]
!mv: İstemci dosya sisteminde dosya dizin isimlerini değiştirmek veya dosya ve/veya dizinleri başka dizinlere taşımak için kullanılır.
!mv [Taşınacak dosya dizin(ler)] [yeni dizin veya isim]
!mkdır (ya da !mk): İstemci dosya sistemi üzerinde dizin(ler) yaratma işlevini görür.
!mkdır [Yara
tılması istenen dizin listesi]
!mk [Yaratılması istenen dizin listesi]
!rmdır: İstemci dosya sisteminden dizin(leri) silmek için kullanılır
!rmdır [silinmesi istenen dizin listesi]
!rm: İstemci dosya sisteminden dosya(ları) silmek için kullanılır
!rm [silinmesi istenen dosya listesi]
Sonuç J
Saka her ne kadar evdeki bütün ihtiyacımı karşılamış olsa da bu işe başlarken kafamdan geçen en büyük etken ağdaki hız sorununa çözüm bulmaktı. ProFTP sunucusu ve windows'un ftp isemcisi ile dizüstünden bir filmi masaüstüne atmaya çalışırken oldukça yavaş olması sorununa alternatif olsun diye başlamıştım. Şimdi nerdeyse Alfa versiyonu haline gelen bu program maalesef kafamdaki hız sorununu çözebilmiş değil. Ama en azından fazladan bir sürü parametrelerle uğraşmak bir de bu programları makinamda kurulu bulundurma zorunluluğundan kurtuldum diyerek kendimi avutuyorum.
Belki de hız sorunu istemci ile sunucu arasında tampon belleklerin (TCP/IP tamponlarının) taşmasını indirgemek için kendi bilgilendirme sistemimi kullanmış olmamdan kaynaklanıyor olabilir. Ya da benim evde kullandığım ADSL modemin LAN anahtarları her ne kadar 100Mbit/s olarak bilgisayar tarafından algılansa da gerçekte oldukça düşük bir performans sergiliyor da olabilir. Bunların testlerini de henüz tamamlamış değilim.
Tabi bir de testlerin tam olarak yapılamamış olması nedeniyle program içerisinde Bug'lar olabilir. Bunları bundan sonra bu programı kullanmaya gönüllü arkadaşlarla kullanırken ortaya çıkacağından eminim. Lütfen program hakkında veya Java hakkında her tür fikrinizi paylaşmaktan çekinmeyin. Neticede herşey zamanla birçok kişinin beyninden çıkan minik hayallerin çığlara dönüşmesiyle oluyor. Abaküsten 9 nanometreye geçiş bin yılların öyküsü, şaka değilJ
Gelecek ay, tabi ki patent alma işlemlerini tamamlayabilmiş olursam, Unix veya kabuk tabanlı işletim sistemlerinde veri tabanı ile kabuk programlamayı birleştiren SQLShell programını tanıtacağım. Her ne kadar bu işte tembellik yüzünden zaman kaybetmiş ve GNU'cular tarafından, yazdığım programın çok değişik mimaride, daha alt versiyonu çıkmış olsa bile diğerine göre oldukça farklı özellikleri var. Umarım gelecek ay tekrar görüşürüzJ
Serkan ALIMCI
john_naczky@yahoo.co.uk