8. Grup – Qostebek Projesi

Bir Oyunlu Chat Projesi…

Sorunlar & Çözümler için arşiv

Oto. Kaydırma Sorunu ve Çözümü

Mesaj penceremizde, yeni bir mesaj geldiği zaman, mesajların yukarı doğru kaymasını sağladık.

Bu işlemi caret(işaretçi) pozisyonunu, mesajların uzunluğuna eşitleyerek yaptık.

Kod Olarak:

int pos=jTextArea1.getDocument.getLength();
jTextArea1.setCaretPosition(pos);

Son rütuşları yaparken bu düzeltmeyi bloga yazalım istedik.. :)

Applet Sorunu ve Çözümü.

Uzunca bir zamandır Applet olarak yaptığımız oyunları Frame (swing’de diyebiliriz) içinde nasıl çalıştıracağımızı araştırıyorduk. Burada Appletin aslında bir panel olduğunu öğrendik. Yani Appletin çizim yaptığı yer bildiğimiz paneldi. Bunu da frameye eklemek de herhangi bir component eklemek demekti. Aşağıdaki kodla frameye applet ekliyoruz.Framenin psvm’sine..
frameliPencere fp = new frameliPencere();
Applet d = new damaAppleti();

fp.getContentPane().add(d);
d.init();
d.setSize(561, 561);

Applet olarak d nesnesi oluşturup bunu damaAppleti yaptık. Kullandığımız pencerenin nesnesini oluşturup Applet’i ekledik, boyutunu verdik ve init metodunu çalıştırıp başlattık.

Peki ya çizimler nasıl olacak?

Normal Image nesnesi ile bu eklenen applette resim çizimi yapamıyoruz. Bunu da Javanın sitesinde BufferedImage nesnesini kullanarak çözebileceğimizi öğrendik. Daha doğrusu resimleri dosyadan okutarak yapabiliyormuşuz..

Şöyle ki:

import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;


…// Global değişkenler arasına:

BufferedImage mpul;
BufferedImage kpul;
BufferedImage skpul;
BufferedImage smpul;

…// Init Metoduna : Kaynaktaki resim dosyasını al, global değişkene ver.

try {
mpul = ImageIO.read(this.getClass().getResource( “mpul.png”));
kpul = ImageIO.read(this.getClass().getResource( “kpul.png”));
skpul = ImageIO.read(this.getClass().getResource( “skpul.png”));
smpul = ImageIO.read(this.getClass().getResource( “smpul.png”));

} catch (Exception ex) {
ex.printStackTrace();
}

…//Paint Metodu : Normal Image nesnesi çizdirir gibi çiz..

g.drawImage(kpul, i*70, j* 70, this);
g.drawImage(mpul, i*70, j* 70, this);
g.drawImage(skpul, i*70, j* 70, this);
g.drawImage(smpul, i*70, j* 70, this);


İletişim sorunu? Çözümü.

Qostebek’in kazma işlemini ve sebzeleri nasıl taşıyacağı ilk sorunumuzdu. Bilgisayar iletişimi hakkında hiçbirşey bilmeden bu projeye başlamıştık. Herşeyden önce bunu nasıl yapabilirdik ve nasıl yaptık onu anlatacağız.

Önce Hocamıza sorduk! Bunu nasıl yapabiliriz diye ve öğrendik: Socket ve Stream kullanarak. Socket’leri köstebeğin yolunun iki ucu olarak düşünebiliriz, stream(akış) ise yolun kendisi diyebiliriz, tabiri caiz ise. İnternet ve kitap araştırmalarımız ile, önce iletişim protokolleri (TCP, UDP gibi) hakkında yüzeysel bilgi aldık. Neyi sağlayıp neyi sağlamadığına şöyle uzaktan bir baktık sadece.

Ardından bu gibi sistemlerin nasıl çalıştığını, yapının nasıl olduğunu merak ettik. Öğrendik ki, Server/Client (Sunucu/Alıcı) yapısında olmalı. Yani bir merkez olmalı (Server), bu merkez bağlanan herkesle iletişim kurabilmeli ve yönlendirici rol almalıydı. Client ise dağılmış olarak çalışan programlar olacaktı. Yani kullandığımız MSN’de bir nevi clienttir.  Bu şekilde Clientler servere bağlanacak ve diğer cliente yollamak istedği mesajı servera iletecekti. Server de bu mesajı alıp, gitmesi gereken akışa (suya) mesajı şişeleyip bırakacaktı. Diğer client bu şişeyi alıp, “bir yeni iletiniz var” diyecekti.

-Örnek karmaşası olmaması için açıklayalım: Bir clientin servera bağlanması için iki köstebek çaışıyor. Biri Server’dan Cliente yol kazıyor, diğeri Client’ten Server’a, çift şeritli yol :D Giden, gelen.Fiziğe aykırı ama bu yollarda çift taraflı, durmadan su akıyor ve köstebekler sebze yerine şişe bırakıyor suya. Server’da Client’ta birer köstebektir.-

Peki ama bunlar mesajın geldiğini nasıl anlayacaktı?

Bu parçaların (Serverin veya Clientin) bir mesaj geldiğini anlamasını nasıl sağlayacaktık? Eğer bu gerçek hayatta olsaydı, derenin başına bir nöbetçi (tellal) koymamız lazımdı. Böylece o orda bekleyecek, programımızda başka işler yapabilecekti. Eee bu nasıl olabilirdi ki? Programdan ayrı bir şeylerin çalışması ve sonsuz bir döngü gibi akışı beklemesi lazımdı! Ah sanırım cevap çıktı! Threadlar!

Mesajıda aldık, peki kimden gelmişti bu mesaj?

Mesajların başında mesaj hakkında bilgi, -kimden kime gittiği gibi- sonunda da mesajın bittiğini gösteren işaretler koyarak, şişemizi etiketlemiş olduk. Şişeyi “<msj:GÖNDEREN:ALAN>MESAJ</msj>” olarak oluşturduk ve suya bıraktık. Gerisini server düşünsün..Nasıl mı düşünecek? Bakacak ki yeni şişe gelmiş, (şişenin kapağı “<msj:” ve dibi de “</msj>” olarak düşünüldü) şişeyi kırıp mesajı, gönderen ve alıcıyı okuyup yeni bir şişe ile başka sulara bırakacak..

Server göndereceği suyu nereden bilecek?

Server programımız hani bağlantı bekliyordu ya! Tellali pardon threadi yeni bir kullanıcı nesnesi (biz userObj gibi bir class yazdık ve bağlanan kullanıcıların bilgilerini bu nesnelerde tuttuk) oluşturup bu nesneleri esnek bir vektör dizisine atıyor. Sonra ufak bir metodla alıcı ismine sahip olan kişiyi bu vektör dizisinde bulup, onun akışına bırakıyor.

Böylece iletişimi sağlamış olduk, mesajı, kimden kime gittiğini anlayabiliyor ve gereken yönlendirmeyi yapabildik.

Takip Et

Get every new post delivered to your Inbox.