*Sitemize Üye Olunca Elinize Ne Geçer?

<--- 1. Üye Olarak Linkleri Görebilirsiniz... --->

<--- 2. İstediğiniz Kadar Paylaşım Yapabilirsiniz... --->

<--- 3. Güzel Bir Forum Hayatı Yaşayabilirsiniz... --->


Join the forum, it's quick and easy


*Sitemize Üye Olunca Elinize Ne Geçer?

<--- 1. Üye Olarak Linkleri Görebilirsiniz... --->

<--- 2. İstediğiniz Kadar Paylaşım Yapabilirsiniz... --->

<--- 3. Güzel Bir Forum Hayatı Yaşayabilirsiniz... --->

Would you like to react to this message? Create an account in a few clicks or log in to continue.

● En Güncel Paylaşım Platformu ●

---Misafir--- Hos Geldiniz Daha iyi Bir Hizmet İçin Üye olunuz.ÜyeLer Link GörebiLir

    Java ile Sohbet Programı

    MnyTirith
    MnyTirith
    ● Admin ●
    ● Admin ●


    <b>Doğum tarihi</b> Doğum tarihi : 20/06/90

    Java ile Sohbet Programı Empty Java ile Sohbet Programı

    Mesaj tarafından MnyTirith Salı Mart 09, 2010 11:39 am

    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:

    [Linkleri görebilmek için üye olun veya giriş yapın.]
    [Linkleri görebilmek için üye olun veya giriş yapın.]
    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.
    MnyTirith
    MnyTirith
    ● Admin ●
    ● Admin ●


    <b>Doğum tarihi</b> Doğum tarihi : 20/06/90

    Java ile Sohbet Programı Empty Geri: Java ile Sohbet Programı

    Mesaj tarafından MnyTirith Salı Mart 09, 2010 11:40 am

    İ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.
    MnyTirith
    MnyTirith
    ● Admin ●
    ● Admin ●


    <b>Doğum tarihi</b> Doğum tarihi : 20/06/90

    Java ile Sohbet Programı Empty Geri: Java ile Sohbet Programı

    Mesaj tarafından MnyTirith Salı Mart 09, 2010 11:41 am

    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.
    MnyTirith
    MnyTirith
    ● Admin ●
    ● Admin ●


    <b>Doğum tarihi</b> Doğum tarihi : 20/06/90

    Java ile Sohbet Programı Empty Geri: Java ile Sohbet Programı

    Mesaj tarafından MnyTirith Salı Mart 09, 2010 11:41 am

    001/**
    002*
    003* @author Ahmet
    004*/
    005import java.io.*;
    006import java.net.*;
    007import java.util.*;
    008
    009public class
    clientMsgHandler extends Thread{
    010
    011private DatagramSocket
    socket;
    012private DatagramPacket
    giden;
    013private DatagramPacket
    gelen;
    014private InetAddress
    address;
    015
    016private int msgType;
    017private String received;
    018private String[] parsedMsg;
    019public String myName;
    020public String message;
    021public String receiverName;
    022public String senderName;
    023
    024private static
    final int
    PORT = 4444;
    025private static final
    String MSG_SEPERATOR = ">";
    026private static final
    int ADD_ME=0;
    027private static final
    int REMOVE_ME=1;
    028private static final
    int SEND_MSG=2;
    029private static final
    int GET_USERS=3;
    030private static final
    int ACK_MSG =
    4;
    031public clientGUI parent;
    032
    033public boolean
    connected = false;
    034public String hostname;
    035public String msg2send;
    036public Vector clients = new
    Vector();
    037
    038public clientMsgHandler(String
    argHostname) throws IOException{
    039hostname = argHostname;
    040address =
    InetAddress.getByName(hostname);
    041socket = new DatagramSocket();
    042socket.setSoTimeout(0);
    043}
    044
    045@Override
    046public void run(){
    047while(true){
    048try{
    049Recieve();
    050socket.setSoTimeout(0);
    051}catch(Exception e){}
    052}
    053
    054}
    055public void SetHost(String
    argHostname) throws UnknownHostException{
    056hostname = argHostname;
    057address =
    InetAddress.getByName(hostname);
    058}
    059private void Send(){
    060byte[] buf = new byte[msg2send.length()];
    061buf = msg2send.getBytes();
    062giden = new DatagramPacket(buf,
    buf.length, address, PORT);
    063try{
    064socket.send(giden);
    065}catch(Exception e){}
    066System.out.println("Giden mesaj: " +
    msg2send);
    067}
    068
    069public void
    Recieve(){
    070byte[] buf = new byte[256];
    071gelen = new DatagramPacket(buf,
    buf.length);
    072try{
    073socket.receive(gelen);
    074}catch(Exception e){}
    075received = new String(gelen.getData(),
    0,
    gelen.getLength());
    076System.out.println("Gelen mesaj: " +
    received);
    077ParseMsg();
    078HandleMsg();
    079}
    080
    081private void
    BuildMsg(int
    argFlag){
    082msg2send =
    myName+MSG_SEPERATOR+receiverName+MSG_SEPERATOR+argFlag+MSG_SEPERATOR+message;
    083}
    084
    085public void
    SendMsg(){
    086BuildMsg(SEND_MSG);
    087Send();
    088}
    089
    090public void
    ParseMsg(){
    091
    092try {
    093parsedMsg =
    received.split(MSG_SEPERATOR);
    094senderName = parsedMsg[0];
    095msgType =
    Integer.parseInt(parsedMsg[1]);
    096message = parsedMsg[2];
    097} catch (Exception exception) {
    098parent.SetStatus("Bağlantı kurulamadı.");
    099msgType = -1;
    100message = "";
    101}
    102}
    103
    104public void
    Connect(){
    105try {
    106message = myName;
    107receiverName = "Server";
    108BuildMsg(ADD_ME);
    109Send();
    110socket.setSoTimeout(2000);
    111Recieve();
    112socket.setSoTimeout(0);
    113
    114} catch (SocketException ex) {}
    115}
    116
    117public void
    Disconnect(){
    118receiverName= "Server";
    119BuildMsg(REMOVE_ME);
    120Send();
    121connected=false;
    122}
    123
    124public void
    HandleMsg(){
    125if(msgType==SEND_MSG){
    126parent.AddMessage(message,senderName);
    127}
    128else if(msgType==REMOVE_ME){
    129RemoveClient(message);
    130parent.UpdateUserList();
    131}
    132else if(msgType==ACK_MSG){
    133connected=true;
    134}
    135else if(msgType==ADD_ME){
    136clients.add(message);
    137parent.UpdateUserList();
    138}
    139else if(msgType==GET_USERS){
    140String[] clientList =
    parsedMsg[2].split("\\|");
    141BuildClientList(clientList);
    142start();
    143}
    144}
    145
    146public void
    GetClientList(){
    147message = myName;
    148BuildMsg(GET_USERS);
    149Send();
    150Recieve();
    151}
    152
    153private void
    BuildClientList(String[] clientList){
    154clients.removeAllElements();
    155for (int i = 0; i < clientList.length; i++) {
    156if(!myName.equalsIgnoreCase(clientList[i].toString()))
    157clients.add(clientList[i]);
    158}
    159}
    160
    161private void
    RemoveClient(String argName){
    162for (int i = 0; i < clients.size(); i++) {
    163String tmp = (String)
    clients.elementAt(i);
    164if (tmp.equals(argName)) {
    165clients.remove(i);
    166break;
    167}
    168
    169}
    170
    171}
    172
    173}
    MnyTirith
    MnyTirith
    ● Admin ●
    ● Admin ●


    <b>Doğum tarihi</b> Doğum tarihi : 20/06/90

    Java ile Sohbet Programı Empty Geri: Java ile Sohbet Programı

    Mesaj tarafından MnyTirith Salı Mart 09, 2010 11:42 am

    001import java.io.IOException;
    002
    003/*
    004* clientGUI.java
    005*
    006* Created on 16 Nisan 2008
    Çarşamba, 21:26
    007*/
    008import
    java.net.UnknownHostException;
    009import
    javax.swing.JOptionPane;
    010
    011/**
    012*
    013* @author Ahmet
    014*/
    015public class clientGUI extends javax.swing.JApplet
    {
    016
    017private clientMsgHandler tr;
    018
    019private void
    jTextField1ActionPerformed(java.awt.event.ActionEvent
    evt) {
    020// Kullanıcı adı girişi
    021Connect();
    022}
    023
    024private void
    jButton1ActionPerformed(java.awt.event.ActionEvent
    evt) {
    025// Bağlan butonu
    026Connect();
    027}
    028
    029private void
    jButton2ActionPerformed(java.awt.event.ActionEvent
    evt) {
    030// Gönderme işlemi
    031int selected = jList1.getSelectedIndex();
    032if(selected>-1)
    033SendMessage();
    034jTextField2.requestFocusInWindow();
    035}
    036
    037private void
    jTextField2ActionPerformed(java.awt.event.ActionEvent
    evt) {
    038// Gönderme işlemi
    039int selected = jList1.getSelectedIndex();
    040if(selected>-1)
    041SendMessage();
    042}
    043
    044private void
    jList1ValueChanged(javax.swing.event.ListSelectionEvent
    evt) {
    045// Listeden kişi seçildiğinde:
    046jTextField3.setText(jList1.getSelectedValue().toString());
    047jButton2.setEnabled(true);
    048}
    049
    050private void
    jTextField1FocusGained(java.awt.event.FocusEvent
    evt) {
    051// Kullanıcı adı girişi
    052if(jTextField1.getText().equalsIgnoreCase("Kullanıcı Adı"))
    053jTextField1.setText("");
    054}
    055
    056private void
    jTextField4FocusGained(java.awt.event.FocusEvent
    evt) {
    057// Server IP
    058if(jTextField4.getText().equalsIgnoreCase("Server IP"))
    059jTextField4.setText("");
    060}
    061
    062public void
    SendMessage(){
    063tr.message =
    jTextField2.getText();
    064tr.receiverName =
    jList1.getSelectedValue().toString();
    065tr.SendMsg();
    066AddMessage(tr.message,tr.myName);
    067jTextField2.setText("");
    068}
    069
    070public void
    AddMessage(String argMsg, String argSender){
    071jTextArea1.append("\n" + argSender + ":" + argMsg);
    072
    073}
    074
    075public void
    UpdateUserList(){
    076jList1.removeAll();
    077jList1.setListData(tr.clients);
    078}
    079
    080public void
    Connect(){
    081try {
    082tr.myName = jTextField1.getText();
    083tr.SetHost(jTextField4.getText());
    084tr.Connect();
    085if (tr.connected) {
    086jList1.setVisible(true);
    087jTextField2.setVisible(true);
    088jButton2.setVisible(true);
    089jTextField1.setEnabled(false);
    090jTextField4.setEnabled(false);
    091tr.GetClientList();
    092jList1.setListData(tr.clients);
    093jButton1.setEnabled(false);
    094SetStatus("Bağlantı Kuruldu");
    095}
    096} catch (UnknownHostException ex)
    {
    097
    098}
    099}
    100
    101public void
    SetStatus(String argMsg){
    102jTextField3.setText(argMsg);
    103}
    104
    105}
    MnyTirith
    MnyTirith
    ● Admin ●
    ● Admin ●


    <b>Doğum tarihi</b> Doğum tarihi : 20/06/90

    Java ile Sohbet Programı Empty Geri: Java ile Sohbet Programı

    Mesaj tarafından MnyTirith Salı Mart 09, 2010 11:42 am

    001class ClientHandler extends
    Thread{
    002
    003private static
    final int
    PORT = 4444;
    004private static final
    int BUFFER_LENGTH
    = 256;
    005private static final
    String MSG_SEPERATOR = ">";
    006
    007private static
    final int
    ADD_ME=0;
    008private static final
    int REMOVE_ME=1;
    009private static final
    int SEND_MSG=2;
    010private static final
    int GET_USERS=3;
    011private static final
    int ACK_MSG =
    4;
    012
    013public Vector
    clients = new Vector();
    014protected DatagramSocket socket = null;
    015
    016String receivedMsg; // Parse edilmemis mesaj
    017private String message; // Mesajin icerigi - yazi
    018private int msgType;
    // Mesaj turu
    019private String msg2send; // Gonderilecek mesaj
    020private SocketAddress receiverAdress; // Mesajin gidecegi adres
    021private SocketAddress senderAddress; // Mesajin geldigi adres
    022private String receiverName; // Mesajin gidecegi kisi
    023private String senderName; // Mesaj gonderen kisi
    024public ServerGUIView parent;
    025
    026@Override
    027public void run(){
    028while(true){
    029try{
    030ServerReceive();
    031ParseMsg();
    032HandleMsg();
    033}catch(Exception e){}
    034
    035}
    036}
    037
    038public ClientHandler()
    throws IOException {
    039super("ClientHandler");
    040socket = new DatagramSocket(PORT);
    041}
    042
    043public void
    RemoveClient(String argName){
    044for(int i=0;i
    045Client tmp =
    (Client)clients.get(i);
    046if (tmp.clientName.equals(argName)){
    047clients.remove(i);
    048break;
    049}
    050}
    051}
    052
    053public void
    GetReceiverAddressByName(){
    054for(int i=0;i
    055Client tmp =
    (Client)clients.get(i);
    056if (tmp.clientName.equalsIgnoreCase(receiverName)){
    057receiverAdress =
    tmp.clientAddress;
    058break;
    059}
    060}
    061}
    062private void BuildClientList(){
    063message = "";
    064for(int i=0;i
    065Client tmp =
    (Client)clients.get(i);
    066message += tmp.clientName+"|";
    067}
    068
    069}
    070
    071private void
    NotifyAllClients(){
    072message = senderName;
    073senderName = "Server";
    074for(int i=0;i
    075Client tmp =
    (Client)clients.get(i);
    076if (!tmp.clientName.equalsIgnoreCase(message)){
    077receiverAdress =
    tmp.clientAddress;
    078
    079ServerSend();
    080}
    081
    082}
    083}
    084
    085private void
    BuildMsg(int
    argFlag){
    086msg2send =
    senderName+MSG_SEPERATOR+argFlag+MSG_SEPERATOR+message;
    087}
    088
    089public void
    ServerReceive()throws IOException{
    090byte[] buffer = new byte[BUFFER_LENGTH];
    091DatagramPacket gelenPaket = new DatagramPacket(buffer,
    BUFFER_LENGTH);
    092try{
    093socket.receive(gelenPaket);
    094}catch(Exception e){}
    095receivedMsg = new String(gelenPaket.getData(),
    0,
    gelenPaket.getLength());
    096senderAddress =
    gelenPaket.getSocketAddress();
    097}
    098
    099public void
    ServerSend(){
    100try{
    101byte[] buffer = new byte[msg2send.length()];
    102buffer = msg2send.getBytes();
    103DatagramPacket gidenPaket = new DatagramPacket(buffer,
    buffer.length, receiverAdress);
    104socket.send(gidenPaket);
    105}
    106catch(Exception e){
    107
    108}
    109}
    110
    111private void
    ParseMsg(){
    112String[] parsedMsg =
    receivedMsg.split(MSG_SEPERATOR);
    113senderName = parsedMsg[0];
    114receiverName = parsedMsg[1];
    115msgType =
    Integer.parseInt(parsedMsg[2]);
    116message = parsedMsg[3];
    117}
    118
    119public void
    HandleMsg()throws
    IOException{
    120if(msgType==ADD_ME){
    121parent.AddTextarea("Yeni kullanici: " +
    message + ", adresi:" + senderAddress+"\n");
    122clients.add(new Client(message,senderAddress));
    123receiverAdress =
    senderAddress;
    124BuildMsg(ACK_MSG);
    125ServerSend();
    126BuildMsg(ADD_ME);
    127NotifyAllClients();
    128}
    129else if(msgType==SEND_MSG){
    130GetReceiverAddressByName();
    131parent.AddTextarea(senderName +
    " -> " + receiverName + " mesaj
    gonderiyor :'"+ message + "'\n");
    132BuildMsg(SEND_MSG);
    133ServerSend();
    134}
    135else if(msgType==REMOVE_ME){
    136parent.AddTextarea(senderName +
    ", bağlantıyı sonlandırdı.\n");
    137RemoveClient(senderName);
    138message = senderName;
    139BuildMsg(REMOVE_ME);
    140NotifyAllClients();
    141}
    142else if(msgType==GET_USERS){
    143parent.AddTextarea(senderName+" kullanicisina liste yollaniliyor.\n");
    144BuildClientList();
    145senderName = "Sunucu";
    146receiverAdress =
    senderAddress;
    147BuildMsg(GET_USERS);
    148ServerSend();
    149}
    150}
    151}
    152
    153class Client{
    154String clientName;
    155SocketAddress clientAddress;
    156
    157public Client(String
    argName,SocketAddress argAddress){
    158clientName = argName;
    159clientAddress = argAddress;
    160}
    161}

      Forum Saati Paz Nis. 28, 2024 2:47 am