Rss Feed

Java ile Sohbet Programı

Tarih: March 17th, 2009 | Yazan: | Kategori: Programlama | Etiketler: , , , , | 37 Yorum »
Sonunda uzun zamandır ertelediğim bu yazıyı da yayınladım ve kafamdan sildim. Aşağıda göreceğiniz kodlar basit bir sohbet programının kodlarıdır. Ayırca java'da soket programlama için de bir örnek teşkil etmektedir. Programı NetBeans ile yazdım ve NetBeans tarafından otomatik olarak eklenen kodlar aşağıda yer almamaktadır.

Kodları ve programın işleyişini daha iyi anlayabilmeniz için bir takım terimleri ve yapıları bilmeniz gerektiğini düşünerekten öncelikle bu bilgileri verelim.

Protokol Nedir?

Herhangi bir ağ içerisinde bulunan cihazların birbirleriyle haberleşmeleri için bellirli protokoller tanımlanmıştır. Bu protokoller sayesinde kullanıcılar alt yapıdaki detaylarla uğraşmadan veri alışverişini gerçekletirebilir.

Farklı amaçlar için farklı protokoller geliştirilmiştir. Bu farklı protokollerin birbirlerine göre üstünlük ve zayıflıkları vardır. Kullanım alanına göre doğru protokol seçilmelidir.

Yaztığım programda User Datagram Protokol  – UDP protokolünü kullandım.  UDP protokolü veri iletişimini bağlantı kurmaksızın paketler gönderir. Bağlantı kurulmadığından dolayı protokolden mesajın iletildiğine dair herhangi bir bilgi edinilemez. Bu tip bir onay sistemi kullanıcı tarafından isteğe bağlı olarak ayrıca yazılmalıdır. UDP’de gönderilen paketlerin herhangi bir sıra numarası ve sırayla ulaşma garantisi de yoktur. Bu tip özellikler için ekstra başlık bigileri gerekmektedir, UDP bu başlık bilgilerini içermediğinden başlık bilgisi de diğer protokllere göre (ör:TCP) daha küçüktür. Başlık bilgilerinin küçük olması sayesinde UDP daha az bant genişliğine ihtiyaç duyar. Bu avantajından dolayı gerçek zamanlı ses veya görüntü iletişiminde tercih edilir.

Port Nedir ?

Portlar bir bilgisayarın ağda sahip olduğu IP adresinden dışarıya açılan birbirinden bağımsız kapılar olarak tanımlanabilir. Port numaraları 16bit ile ifade edildiğinden 65536 adet port mevcuttur. Herhangi bir uygulamanın kullanacağı port numarası seçilirken daha önceden başka bir programın bu portu kullanıp kullanmadığına dikkat edilmelidir. Aksi halde iki uygulama da düzgün çalışmayabilir.

UDP protokolünde veri iletişimi yapmak için IP ve PORT ikilisini kullanarak adresleme yapmak gerekir. Bu ikili kullanar bir soket yaratılır ve iletişim soket üzerinden yapılır.

Soket Nedir ?

Soket IP adresi ve Port birleşiminden oluşan uygulamalarda ağ içerisinde bulunan alt düzey ayrıntılarla uğraşmadan veri alışverişi yapmayı sağlayan ve unix sistemlerde bulunan dosya yapısına benzer bir yapıdır.  TCP/IP protokolünde mevcut olan soketler uygulama seviyesinde bağlantıları simgelemeye yarar.

Yaygın olarak kullanılan iki türlü soket yapısı mevcuttur. Bunlardan biri SOCK_STREAM ile tanımlanan ve streaming yapmaya yarıyan soket tipidir. Bu soket yapısında bağlantılı (connection oriented) haberleşme kullanılır. Yani haberleşme sırasında aktif olan bağlantı ve soket yapısı mevcuttur. TCP protokolü SOCK_STREAM tipinde soketler üzerinden haberleşme yapar. Bu soketlerden yapılan iletişim tamamen güvenlidir. Yani yanlış veri iletimi olması durumunda protokolden dolayı sistem kararlı ve doğru veriyi iletene kadar tekrar gönderme/isteme işlemini yapar. Ayrıca bu soketler üzerinden gönderilern verilerin alıcı tarafa da aynı sırayla ulaşacağı garanti edilmiştir. “A” ve “B” datasını içeren iki mesajı gönderdiğimizde alıcı tarafta yine “A” ve “B” sırasıyla alınacağı garanti edilmiştir.

Diğer bir soket türü ise SOCK_DGRAM ile tanımlanan datagram tipi soketlerdir. TCP’ye göre güvensiz veri iletişimi yapar. Bunun nedeni gönderilerecek datayı UDP protokolü üzerinden yollaması ve paketi bir kez ağa bıraktıktan sınra herhangi bir takip işlemi yapmamasıdır. Yani kullanıcıya verinin ulaşıp ulaşmadığına dair herhangi bir bilgi sağlamaz. Buna karşılık alıcıdan onay mesajı yollatarak iletimi biraz daha olsun kararlı hale getirebilinir. Bu soketin tercih edilme sebebi ise stream türünde yayınlardır. Her ne kadar streaming soket “streaming” için daha uygun gibi görünsede datagram tipi soketler bu iş için daha uygundur. Bunun sebebi kayıp paketlerin tekrar yollanması, aşırı başlık bilgisi, çok bant genişliği harcaması, bağlantının sürekli olarak aktif kalması gibi dezavantajlarından dolayı datagram soketler streaming işlemi için tercih edilmektedir.

Paket Nedir ?

UDP ile bağlantısız haberleşme yapıldığından veriler birbirinden bağımsız paketler ile gönderilir. TCP protokolünde bağlantılı haberleşme yapıldığından veri iletişimi başlarken bir bağlantı kurulur ve sürekli olarak bu bağlantı üzerinden haberleşme sağlanır. Veri iletişimi olmasa dahi bağlantı açık kalır. UDP  protokolü için Java dilinde belirlenen paket değişken tipi  Datagram Packet’dir.  Her bir paket içerisinde gönderilecek veri ve paketteki veri miktarını belirten değişkenler vardır. Bunun yanı sıra paketi gönderdiğimiz bilgisayarın IP adresi ve port numarası da pakete dahil edilmelidir.

Gönderici ve alıcı adresleri de UDP paketinin içinde olmasına rağmen bu paketler tek başına iletişim için yeterli değildir. UDP paketleri de ağda iletim için IP protokolünü kullanır. Bundan dolayı her paketin başına IP başlık bilgileri de eklenir. Aşağıdaki şekilde bir IP başlığı ve altında ise UDP paketinin temel yapısı gösterilmiştir:

paket.jpg

udp.jpg

Programın Genel Yapısı

Program sunucu/istemci mimarisine dayanarak çalışmaktadır. İstemci kısmı Applet olarak yazıldı ve web üzerinden sohbet edebilme imkanı sağlamaktadır. Sunucu kısmı ise masaüstü uygulaması olarak yazılmıştır. Sunucu çalışmaya başlar başlamaz ilgili portu dinleyerek gelen paketleri değerlendirerek mesajları istemciler arasında iletmektedir. İstemciler birbirleri arasında direk mesajlaşmak yerine sunucu üzerinden mesajlaşmaktadır. Bundan dolayı istemcilerde diğer istemcilerin adresleri yerine sadece isimleri tutulmaktadır.

İstemci Tarafı

İstemci kodu iki temel sınıftan oluşmaktadır. ClientMsgHandler ve ClientGUI. ClientMsgHandler veri iletim fonksiyonlarını içermektedir. ClientGUI ise arayüzü ve ClientMsgHandler’dan gelen verileri kullanıcıya göstermektedir. ClientMsgHandler thread sınıfını implement ederek oluşturulmuştur. Bu sayede arayüzde herhangi bir takılma olmadan veri iletişim işlemleri eş zamanlı olarak yapılmaktadır.

Programda iki türde istemci vardır. Birincisi sunucu üzerinde çalışan ve web üzerinden hizmet veren istemcidir. Web üzerinden sunucuya bağlanan istemciler için yazılmıştır ve sunucu adresini bilmeksizin her istemci bu sunucuya bağlanabilir. Diğer istemci türünde ise istemci kodu bilgisayara indirilip web tarayıcısı üzerinden local olarak çalıştırılabilir. Bu istemcide ise sunucunun ip adresini de ayrıca bilmek gerekmektedir.

İstemci Tarafındaki Sınıflar ve Fonksiyonları

ClientMsgHandler sınıfına ait fonksiyonlar:
Send:String tipinde tutulan gönderilecek mesajı byte dizisine çevirir. Daha sonra DatagramSocket üzerinden yollamak üzere yeni bir PatagramPacket hazırlayak oluşturulan byte dizsini, alıc adresini ve iletişimde kullanılacak port numarasını da pakete ekler. Son olarak paketi DatagramSocket üzerinden gönderir.

Recieve: DatagramSocket üzerinden gelen paketi alabilmek için yeni bir DatagramSocket yaratır. Okunan veriyi bu pakete yazdıktan sonra mesaj kısmını byte dizisinden string tipine çevirir. Daha sonra mesajı işlemek üzere ParseMsg ve HandleMsg fonkisyonlarını çağırır.

SetHost: Parametre olarak host adresini alıp bu adresi InetAddress türüne çevirir.

BuildMsg: Parametre olarak aldığı mesaj türüne göre gönderilecek mesajı string olarak oluşturur. String türündeki mesajın formatı aşağıdaki gibidir:
gönderici_adı  > alıcı_adı > mesaj_türü > mesaj_içeriği
Bu yapıda “>” sembolü ayraç olarak kullanılmıştır.
Mesaj türleri ise aşağıdaki şekildedir:

ADD_ME – Kullanıcı ekleme
REMOVE_ME – Kullanıcı silme
SEND_MSG – Normal mesaj
GET_USERS – Kullanıcı listesi isteği
ACK_MSG – Onay mesajı

ParseMsg: Alınan mesajı “>” ayracına göre bölümleyerek mesajın içeriğini gerekli değişkenlere atar.

HandleMsg: Parse edilen mesajın türüne bağlı olarak işlemleri gerçekleştirir.  Mesaj türlerine göre yaptığı işlemler aşağıdaki gibidir:

SEND_MSG: Gelen mesajı arayüzde göstermek üzere ClientGUI sınıfına gönderir.

REMOVE_ME: Gelen kullanıcı adını ClientGUI’de gösterilen listeden silmek üzere ClientGUI sınıfına iletir. Aynı zamanda istemcilerin tutulduğu vector yapısından ilgili istemciyi silmesi için RemoveClient fonksiyonuna kullanıcı adını iletir.

ACK_MSG: Bağlantının kurulduğunu onaylayan bu mesaj alındığı zaman arayüzde gerekli değişiklikler yapılarak mesaj iletimine uygun yapı oluşturulur.

ADD_ME: Gelen kullanıcı adını istemcilerin tutulduğu vector yapısına ekler ve arayüz sınıfının da bu kullanıcı adını göstermesini sağlar.

GET_USERS: Kullanıcı isteğinin karşılığı niteliğindedir. İlk  kez bağlantı kuruluduğunda liste alınarak arayüzde gösterilir. Aynı zamanda istemcilerin her birini vector yapısına ekler. Bu mesaj alındıktan sonra bağlantı tamamlanmış ve kullanıcı listesi alınmış olduğundan dolayı mesaj dinleme işlemini başlatacak thread çalıştırılr. Sonsuz bir döngü içinde ilgili port sürekli olarak dinlenir.

Connect: ClientGUI’den alınan kullanıcı adını içeren bir mesaj ile sunucuya bağlantı isteğini gönderir. Send methodunu çağırarak mesajın iletimini sağlar, daha sonra Recieve methoduyla bağlantı isteğine gelcek cevabı bekler. Cevap gelmeme ihtimaline karşı soket’in bloklanma süresi 2sn olarak ayarlanmıştır. Sunucundan cevap alınırsa veya soket süresi dolarsa bağlantı kurulamadığı ClientGUI’de gösterilir ve soket’in bloklanma süresi tekrar sıfıra setlenir (sonsuz).

Disconnect: Sunucuylya yapılan bağlantının bitirilmesi isteğini gönderir. Bu sayede bağlantıyı kapatan istemciler diğer istemcilerin listesinden silinecektir. UDP gibi bağlantısız bir iletişim protokolü kullanıldığından dolayı bu işlem gereklidir. Aksi halde sunucu  – istemci arasında sürekli ping gönderek her iki tarafında hala hatta olduğu kontrol edilmelidir.

GetClientList: Sunucu ile ilk defa bağlantı kurulduğu zaman varolan istemcilerin listesini almak için gerekli mesajı oluşturup gönderir ve cevabı alır. Kullanıcı listesi alınmadan önce ilgili port ayrı bir thread ile dinlenmediği için bu fonksiyon içinden Recieve fonkisyonu çağrılmıştır.

BuildClientList:  Sunucu istemciye diğer istemcilerin isim listesini gönderirken isimleri “|” ayracı ile ayırır. HandleMsg fonksiyonu bu ayraça göre gelen veriyi bölerek BuildClientList fonksiyonuna string dizisi olarak iletir. BuildClientList fonksiyonu ise gelen bu diziyi vector yapısına çevirerek kaydeder. Vector yapısı kullanılmasının amacı istemci sayısının dinamik olarak değişmesi ve ClientGUI’de ki listede istemcilerin kolaylıkla gösterilmesidir.

RemoveClient: Herhangi bir istemci sunucuya ayrıdığını bildirdiğinde sunucu geride kalan bütün istemcilere bu mesajı iletir ve istemciler bu fonksiyon ile ayrılan istemcinin adını vector yapısından ve ClientGUI’de kullanılan listeden siler.

ClientGUI sınıfına ait fonkisyonlar:

SendMessage: TextField2’ye girilen mesajı ve JList1’den seçilen kullanıcı adını ClientMsgHandler sınıfına göndererek mesajın sunucuya iletilmesini sağlar.

AddMessage: ClientMsgHandler tarafından alınan mesajları jTextArea’ya kimden geldiğini göstererek ekler.

UpdateUserList: Sunucuya herhangi bir istemci bağlandığında veya ayrıldığında arayüzde gösterilen istemci isimlerini yeniler.

SetStatus: Sunucuya bağlanıp bağlanılmadığını ve mesaj gönderirken hangi kullanıcının seçildiğini jTextFeild3’e yazdırır.

Connect: Bağlan butonuna basıldığı zaman kullanıcıdan alınan ip adresi (veya host adı) ve kullanıcı adıyla sunucuya bağlanmak için ClientMsgHandler’da bulunan Connect fonksiyonun çağırır.

Destroy: Kullanıcı tarayıcıyı kapattığı zaman sunucuya bağlantıyı sonlandırma mesajını gönderir.

Sunucu Tarafı

Sunucu işlemleri genel olarak istemcilerin listesini tutmak ve gelen mesajları iletmek üzerine kuruludur.  ClientHandler sınıfı sürekli olarak ilgili portu dinleyerek mesaj iletim işini üstlenmektedir. Onun haricinde serverGUI mesajlaşmaların ve sisteme gelip giden istemcilerin özetini gösteren bir arayüz oluşturmaktadır.

ClientHandler sınıfına ait fonksiyonlar:

BuildMsg: Parametre olarak aldığı mesaj türüne göre gönderilecek mesajı string olarak oluşturur. String türündeki mesajın formatı aşağıdaki gibidir:
gönderici_adı  > alıcı_adı > mesaj_türü > mesaj_içeriği
Bu yapıda “>” sembolü ayraç olarak kullanılmıştır.
Mesaj türleri ise aşağıdaki şekildedir:

ADD_ME – Kullanıcı ekleme
REMOVE_ME – Kullanıcı silme
SEND_MSG – Normal mesaj
GET_USERS – Kullanıcı listesi isteği
ACK_MSG – Onay mesajı

ParseMsg:  Alınan mesajı “>” ayracına göre bölümleyerek mesajın içeriğini gerekli değişkenlere atar.

HandleMsg: Parse edilen mesajın türüne bağlı olarak işlemleri gerçekleştirir.  Mesaj türlerine göre yaptığı işlemler aşağıdaki gibidir:

SEND_MSG: Mesaj gönderilecek istemcinin adını clients vector yapısı içinde arar. Bulduğu elemandan adresi alarak mesajı  ilgili istemciye gönderir.  Ayrıca sunucu arayüzünde de mesajı ve kimden kime gönderildiğini yazar.

REMOVE_ME:  İstemci sunucudan ayrıldığı zaman client vector yapısı içinden bu istemciyi siler ve diğer tüm istemcilere ilgili istemci adını yollayarak listelerinden silmesini bildirir. Buna ek olarak sunucu arayüzünde de çıkan istemcinin adını yazar.

ADD_ME: Yeni istemcinin adını ve adresini arayüzde gösterir. Daha sonra istemcilerin tutulduğu vektöre yeni bir istemci sınıfı nesnesi yaratıp ekler. Bundan sonra ise istemciye bağlantının kabul edildiğine dair bir onay mesajı yollar. Yeni gelen kullanıcıya onay mesajı gönderip bağlantıyı kabul ettikten sonra önceden bağlanan istemcilere yeni gelen istemcinin adını gönderir.

GET_USERS:  Bu mesajdan sonra sunucu mesajı gönderen istemciye o anda bağlı olan istemcilerin isimlerini gönderir. İsimler birbirinden “|” ayracı ile ayrılmıştır.

ServerSend: Gönderilecek mesajı byte dizisine çevirerek datagram paketi içine koyar ve datagram soketi üzerinden gönderir.

ServerRecieve: İlgili portu dinleyerek gelen mesajları string tipine çevirir. Ayrıca gönderenin adresini de datagram paketinden çıkararak kaydeder.

NotifyAllClients:  Belirlenen mesajı o anda bağlı olan istemcilerin hepsine gönderir.

BuildClientList: Bağlı olan istemcilerin isimlerini bir string’de birleştirerek mesajı gönderilmeye hazır hale getirir.

GetReceiverAddressByName: Sunucuya gelen mesajlarda sadece gönderilecek istemcinin adı bulunmaktadır. Adresler ise sunucuda tutulan clients vector yapısındadır. Bu fonksiyon mesaj gönderilecek istemcinin adını vector elemanlarıyla karşılaştırıp ilgili adresi bulur.

RemoveClient: Parametre olarak aldığı kullanıcı adını clients vector yapısında arar ve ilgili istemciyi  vector’den siler. Daha sonra geride kalan istemcilere bu silme işlemini bildirir.


37 Comments on “Java ile Sohbet Programı”

  1. 1 Serkan CURA said at 22:54 on March 17th, 2009:

    güzel bi uygulma olmuş Ahmet hocam tebrikler.

  2. 2 Ahmet Kakıcı said at 23:20 on March 17th, 2009:

    Teşekkür ederim, beğendiğine sevindim Serkan :)

  3. 3 Ramazan Uluçay said at 10:21 on March 18th, 2009:

    Java ile soket programlama için güzel bir uygulama olmuş. Eline sağlık.

  4. 4 Ahmet Kakıcı said at 19:54 on April 8th, 2009:

    Sağolasın Ramazan :)

  5. 5 Ahmet said at 15:51 on April 9th, 2009:

    Bize de p2p tarzı bir proje verildi, yine threadler falan kullanilarak aynı anda birden fazla upload yapılabilme vs. gibi. Sanırım burdaki bilgiler biraz da olsa işime yarar. Bi de bunu anlamak var tabi :D baskasinin kodunu anlamak zor oluo ne de olsa. Tesekkurler bu guzel uygulama icin elinize saglık…

  6. 6 atakan said at 21:41 on May 12th, 2009:

    ahmet hocam güzel bir uygulama olmuş ama anlamadığım bir kaç nokta var:
    netbeans kullanıyorum. clientGui ile clientMsgHandler ı proje açıp içine class şeklinde koydum. clientHandler server üzerinde çalışacak demişsiniz o kısmı anlamadım.

    projeyi oluşturma hakkında biraz daha bilgi verebilir misiniz???

    İyi çalışmalar…

  7. 7 atakan said at 09:56 on May 13th, 2009:

    hocam,
    public serverGuiView parent;
    satırında hata veriyor. dolayısıyla parent.AddTextArea gibi satırların hepsinde de hata veriyor. sorunu nasıl aşarım???

  8. 8 Ahmet Kakıcı said at 13:02 on May 19th, 2009:

    Atakan soket programlamayı mı öğrenmeye çalışıyorsun yoksa yukarıdaki kodu aynen çalıştırmaya mı ihtiyacın var?

  9. 9 Java Soket Programlama - NetBeans Projesi | Ahmet Kakıcı said at 13:01 on June 3rd, 2009:

    […] önceden detaylı açıklamasını yaptığım programın kaynak kodlarını vermiştim ancak o kodlarda ide tarafından oluşturulan bölümler […]

  10. 10 Mehmet Yatkı said at 13:53 on June 25th, 2009:

    Selam ben java programlamaya yeni başladım sayılır… Bu uygulamayı aynen çalıştırmak istiyorum ama bir sürü hata veriyor. clientGUI, ClientHandler, clientMsgHandler adlında üç class açtım. Ama bir sürü hata verdi, sanırım arayüzü kendimiz hazırlamalıyız? O halledilebilir birşey ancak ben bu işin altyapısını tam olarak anlayamadım.

    Öncelikle bir sohbet için veritabanı görevi görecek herhangi bir dosya şart mı yoksa portlar arasında veri iletimi yapılırken gelen mesajların bir yere kaydedilmesine gerek yok mu? Bu işi gerçekten adam akıllı öğrenmek istiyorum.. Algoritma oluşturmada pek sıkıntım yok çünkü ASP de profesyonel sayılırım. Ancak bu Java kocaman bir dünya:) bazı kullanımları çözmem gerekiyor. e-posta adresim aynı zamanda msnim de… yardımcı olursanız çok sevinirim…

    Şimdiden teşekkürler. Çalışmalarınızda başarılar dilerim…

  11. 11 Ahmet Kakıcı said at 15:40 on June 25th, 2009:

    @Mehmet bu projenin çalışır halini de yayınladım: http://www.ahmetkakici.com/programlama/java-soket-programlama-netbeans-projesi/

    Sohbet için veri tabanı kullanmak sana kalmış. Ben sadece iletim yapıyorum o kadar. Yani A kullanıcısı B kullanıcısına mesaj yollayacaksa sunucuya ‘B>>MESAJ’ gibi bir veri yolluyor, sunucu da B kullanıcısına ‘MESAJ’ içeriğini olduğu gibi iletiyor.

  12. 12 umit aydin said at 06:31 on August 7th, 2009:

    ahmet bey gercekten tam aradigim bir program yapmissiniz.
    bir odevim vardi bununla ilgili. bu kodlari kopyaladim eclips’te hatalar veriyor. bazi seyleri tanimiyor. sizin verdiginiz source kodunuda indirdim fakat tam olarak anlayamadim. yardimci olurmusunuz.

    tesekkurler

  13. 13 Ahmet Kakıcı said at 13:08 on August 7th, 2009:

    Umut bu programı NetBeans ile yazmıştım. NetBeans proje dosyasını da vermiştim:
    http://www.ahmetkakici.com/programlama/java-soket-programlama-netbeans-projesi/

  14. 14 Anonymous said at 01:06 on October 29th, 2009:

    slm ahmet be ben orhan unv okuyorum bende de bu java ısıne hocamın ıstegıyle gırdım gerckten java kocaman bır dunya yanı su an java hakkında hıc bı sey bılmıyorum desem yerıdır algorıtmada bnmde bır sorunum yok ama buu java kafamı karıstırdı bana bıraz yardımcı olursanız sevırım

  15. 15 İsa Kalınsaz said at 13:54 on February 21st, 2010:

    Merhabalar.Ben bilgisayar mühendisliği bölümü öğrencisiyim.Soket programlama çok ilgimi çekiyor ve de bir projem var o konuda.Yapmış olduğunuz uygulama çok güzel lakin verdiğiniz linkten projenin çalıştırılabilir kodlarını indiremiyorum.Linki tekrardan yenileme imkanınız olabilir mi?Lütfen yakın zamanda uygulamanın indirilebilir linkini yenileyebilirmisiniz.

  16. 16 Duygu said at 19:58 on February 22nd, 2010:

    Ahmet Bey merhabalar, nesneye yonelık programlamaya hakımım ancak javaya yenı başladım. Oncelıkle yukarıda verdıgınız calısm için tesekkur ederım socket programlama ile ilgili guzel bır kaynak olmus ancak ben eclıpse de yazıyorum. applet gelıstırmıstım daha once orada sorunum yok ancak extends yaptıgım halde cast edılemıyor gıbı bır hata verıyor bu benım yazdıgım applet kısmından kaynaklanmıyor. clientMsgHandler kısmında ise ınceledıgım halde sorun goremedım ? sızın bıldıgınız bır nedenı var mı acaba ?

    Not: kopyala yapıstır yapmıyorum. kodları anlayarak yazmaya calıstım. :)

  17. 17 Ahmet Kakıcı said at 20:29 on February 22nd, 2010:

    @İsa Kalınsaz, sunucudaki bir problemden dolayı dosyalar silinmiş. Bilgisayarımda da tam olarak nereye koyduğumu bulamıyorum.
    1-2 gün içinde yedeklerden, bir yerden bulup yüklerim.

    @Duygu hatayı tam olarak görmeden bir şey diyemiyorum.

  18. 18 yasin said at 13:44 on April 3rd, 2010:

    merhaba abi eline sağlık çok güzel bi çalışma olmuş
    takıldığım bi nokta varda abi client tarafını netbeansda proje içinden çalıştırabiliyorum ancak server tarafında main hatası verio yardımcı olabilirmisin abi

  19. 19 Ahmet Kakıcı said at 21:01 on April 3rd, 2010:

    Hatayı tam olarak yazabilir misin?

  20. 20 muhammet said at 11:44 on June 19th, 2010:

    merhaba. javaya daha yeni başladım aradığım bir yazıydı çok güzel olmuş elinize sağlık

  21. 21 Aslan Galata said at 03:37 on August 6th, 2010:

    hocam bu projeyide indirilebilir bir halde yayınlayabilirmisiniz?

  22. 22 Ahmet Kakıcı said at 07:13 on August 6th, 2010:

    Zaten yayınlamıştım
    http://www.ahmetkakici.com/programlama/java-soket-programlama-netbeans-projesi/

  23. 23 Anonymous said at 22:40 on August 21st, 2010:

    […] […]

  24. 24 Javacı said at 03:57 on October 7th, 2010:

    iisde açıyorum hem sunucuda hem localde ama bağlantı kurulamadı diyor sunucuda ise serverda bu kullanıcı giriş yapmaya calışdı diye yazıyor ama html bölümünde bağlantı kurulamadı diyor yardımcı olursanız sevinirim teşekküler.

  25. 25 Ahmet Kakıcı said at 11:57 on October 13th, 2010:

    IIS üzerinde hiç denememiştim aslında, açıkçası IIS konusunda çok tecrübem de olmadığı için sorunun konusunda fikir yürütemiyorum.

  26. 26 zeynep said at 12:39 on November 1st, 2010:

    Merhabalar, ben de socket iletişimine yeni başladım. netbeans kullanıyorum şimdilik ama client ve server uygulamalarını aynı anda aynı bilgisayar üzerinde çalıştırmak için ne yapmam gerekiyor. bu konuda yardımcı olabilirseniz çok sevinirim.

  27. 27 Turgay said at 14:45 on November 24th, 2010:

    Merhaba,
    Multi Threaded Socket programlama ile ilgili bir çok makale okudum ve bende basit bir uygulama yazmaya başladım. Fakat bir problem oluşuyor ve textField kısmına bir deger girip yollamaya çalıştığımda. Direkt hata veriyor. Yazdığım kodu ve arayuz u printscreen ile detaylı anlatabılırım zamaniniz var ise ?

    class altında tanımlı;

    Printwriter out ;

    textField in actionPerformed olayında,
    String txt = textField.getText();
    out.println(txt);

    server a yazdırma işlemini yolladığımda problem sanırsam?

    Hata kodu ;

    Exception in thread “AWT-EventQueue-0″ java.lang.NullPointerException
    at desktopapplication2.Chat$1.actionPerformed(Chat.java:42)
    at javax.swing.JTextField.fireActionPerformed(JTextField.java:492)
    at javax.swing.JTextField.postActionEvent(JTextField.java:705)
    at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:820)
    at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1633)
    at javax.swing.JComponent.processKeyBinding(JComponent.java:2851)
    at javax.swing.JComponent.processKeyBindings(JComponent.java:2886)
    at javax.swing.JComponent.processKeyEvent(JComponent.java:2814)
    at java.awt.Component.processEvent(Component.java:6044)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4630)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)
    at java.awt.Component.dispatchEventImpl(Component.java:4502)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Window.dispatchEventImpl(Window.java:2478)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

  28. 28 Turgay said at 11:37 on November 25th, 2010:

    Merhaba,
    sorunumu aştım, makale için teşekkürler oldukça yararlı bir kaynak.

  29. 29 damage said at 03:42 on January 5th, 2011:

    merhabalar,bu projeleri kod olarak ve indirdigim pakette de calistiraimyorum.yukarida arkadasin belirttigi gibi

    hocam,
    public serverGuiView parent;
    satırında hata veriyor. dolayısıyla parent.AddTextArea gibi satırların hepsinde de hata veriyor. sorunu nasıl aşarım???

    ayni hatayi ben de aliyorum nasil cozebiliriz ? amacim bir seyler ogrenip projemi yapabilmek.en kisa zamanda.

  30. 30 asd said at 13:25 on June 25th, 2011:

    Bu programı bu şekilde yazdıysanız bence C ile yazsanız daha mantıklı olurdu. Nesnellikten çok uzak bir tasarım olmuş. Buna rağmen java kullanmanız sisteme fazladan yük bindirmiş. Ne diyim iyi bir deneme olmuş ama sadece deneme olmuş.

  31. 31 Name said at 14:15 on July 1st, 2011:

    her sistemin bir açığı var mıdır?

  32. 32 Caner Öncü said at 12:37 on September 2nd, 2012:

    Ya allah diye, “şunu şöyle yapın bunu böyle yapın tamamdır” demeden, öncelikle işin jargonunu açıklayarak anlatmanız çok güzel olmuş, elinize sağlık.

  33. 33 Harun said at 11:21 on November 20th, 2012:

    public ServerGUIView parent;

    Şu kod satırında hata veriyor bunu nasıl düzeltebilirim?

  34. 34 Baha said at 05:22 on November 22nd, 2012:

    multi thread(çok kanallı bir server – client ugulamasının işleyiş mantığını biraz açıklamak istiyorum:

    örnek kodda datagram socketle örnek verilmiş. datagram (UDP) sockette paketin gitdip gitmemesinin garantisi yoktur.

    öncelikle javanın kendisi multi thread ve nesne tabanlı bir dil.

    ilk önce ServerSocket(“serverin adresi”, port) şeklinde gelen bağlantı isteklerini adres ve porttan dinleme işlemi için tanımlanır. ServerSocket bir defa çalıştırılır. try-catch bloğunu ister.

    daha sonrasında açık kaldığı sürece gelen istekleri kabul edebileceği bir döngüde – ki bunu while(true) veya while(!ServerSocker.isClosed()) gibi yapılarla tanımlayabilirsiniz ( C++ ta for(;;) şeklinde tanımlar görmekte mümkün) – yeni bir socket nesnesi yaratıp bu sokete .accept() yoluyla atıyoruz. C++ ta buna bind denir. şu an artık o socket client ve server arsında okunup yazılmaya hazırdır. bu socketi yeni bir Server threade (bu thread hem server hem de socket ve socket giriş çıkış bilgilerini tutar) aktara biliriz bu aşamada multi thread olmuş oluyor. thread ve socket bilgisini asenkron vector de tutabiliriz. böylelikle server programı threadler arsından socketleri alıp client-Server-client şeklinde çalışabilir.

    geri kalan işlemleri Gui vs. yamak size kalıyor.

    örneğin vector deki birim sayısı kullanıcı sayısını verir gibi.

    işte mantığı anlatmak zor olduğu için kodlama göstermek daha doğru olurdu yazıda datagram socket örneği gösterilmiş zaten. Benim bahsettiğim TCP/IP socket yapısının kodlaması.

  35. 35 fatma said at 17:46 on April 7th, 2013:

    jtfMessage.requestFocusInWindow(); bu işlemin açıklaması nedir acaba. mantığını öğrenmek istiyorum.

  36. 36 Ali said at 19:14 on July 11th, 2014:

    Ahmet Bey acaba bunu videolu bir şekilde yapabilir misiniz ?

  37. 37 FIRAT said at 15:14 on November 25th, 2014:

    oldukça güzel


Leave a Reply