Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

Karşılıklı mesajlaşmada "Yazıyor..." göstergesi

Konu, 'Web Programlama' kısmında dinlex tarafından paylaşıldı.

  1. dinlex

    dinlex Aktif Üye

    Kayıt:
    23 Aralık 2016
    Mesajlar:
    341
    Beğenilen Mesajlar:
    88
    Şehir:
    Hatay
    Merhabalar,
    Yaptığım bir mesajlaşma sistemini geliştirmek adına mesaj yazarken karşı tarafa "Yazıyor..." bildirisi göndermek istiyorum ama bunu en uygun hangi sistemle yapacağımı bilmiyorum. Yol gösterirseniz sevinirim.

    Örnek vermek gerekirse whatsaa veya facebook'ta biriyle mesajlaşırken eğer karşı taraf birşeyler yazıyorsa ekranın üstünde "Ahmet yazıyor..." şeklinde bildiri çıkıyor ve siz karşı tarafın şuan size birşeyler yazmakla meşgul olduğunu anlıyorsunuz. Ama bunu hangi sistemle yapmalıyım sizce?

    Benim aklıma gelen şu; Bir veritabanı oluşturacam ve mesajı yazan kişi yazmaya başladığında javascrip-ajax ile veritabanına bu kişinin "yazıyor_mu" stununu 1 yapacam. ve kendi tarafımda da yine javascript ile veritabanına her saniye bağlanıp bu bilgiyi çekecem. eğer sonuç 1 ise yazıyordur, 0 ise yazmıyordur.

    Ama bu sistemi çok fazla yoracak, her saniye veritabanına bağlanmak sistemi çok yorar diye düşünüyorum. Üstüne bir de aynı sayfada birkaç sorgu daha var saniyelik olan. Mesajlaşan her kişi 1 saniyede 2-3 sorgu yapmış olacak javascriptle.

    Daha kolay bir yolu var mıdır?
     
  2. sedirAğacı

    sedirAğacı Daimi Üye

    Kayıt:
    2 Mart 2016
    Mesajlar:
    897
    Beğenilen Mesajlar:
    237
    Meslek:
    Bilgisayar programcısı.
    Şehir:
    Aydın
    üç beş ay sonra bu konuyu benimde araştırmam gerekecek.

    Bu konuda ciddi bişey yapmadığım içinde, seni yanlış yönlendirmek istemem. Sadece fikir yazayım, bu konuyu iyi bilenler yardımcı olursa bende sevinirim, vakit kazanmış olurum.

    Facebook gibi web server kullanıp browser aracılığı ile çalışan uygulamalarda, anlık mesajlaşma(instant messaging) için javascript altyapısını kullanıyorlardır diye düşünüyorum.
    "javascript messagechannel()" diye arasan biraz bilgi sahibi olabilirsin. nodeJS görürsen oda direk javascript alt yapısını kullanıyor baştan söyleyeyim.
    Serverde DB yede yine her mesaj sonrası javascript ile kaydediyorlardır. hata kontrolu nasıldır.? Aramak lazım.

    Burda basit bir örnek var. HTML sayfada iFrame içinde js ile halletmiş.
    mdn/dom-examples

    whatsapp hiç kullanmadım ama .exe program diye biliyorum, yani masaüstü kendi kendine browser olmadan çalışan program. Öyle ise yapı faceBook tan farklıdır.
     
    dinlex bunu beğendi.
  3. izmiralem

    izmiralem Aktif Üye

    Kayıt:
    7 Şubat 2010
    Mesajlar:
    290
    Beğenilen Mesajlar:
    32
    Meslek:
    Bilgisayar Teknik Servis Hizmt.
    Şehir:
    izmir
    Mesajlaşma sistemi konusunda yıllardır fazlasıyla kafa patlatmak zorunda kalan bir dostunuz olarak hemen geldim :)

    Benim en çok sevdiğim şeylerden bir tanesi hangi tür proje yapar isem yapayım, insanların alışık olduğu düzeni korumaktır. Mesela bir web sayfasında mesajlaşma sistemi yapacaksam piyasada en çok kullanılan bir web sitesinin mesajlaşma sayfası gibi yaparım. Haa, tasarım olarak klon olayını sevmem, düzen olarak severim. Birazda kendi zevkim ile harmanlayıp sunmayı severim. İnanın yıllardır çok proje yaptım ve tutmalarının tek sebebi de budur diyebilirim. Çünkü insanların yabancılık çekmemesi ve kullanım konusunda kolaylık onları tekrar çekiyor. Bu sebeple benim görüşümce abartmak sayılmayacak ise SEO ya bile etkisinin yansıdığını düşünürüm. Çünkü insanlar sitenizi kullanmayı kolay bulur. Örneğim şuan aktif olarak yönettiğim sitede web mesajlaşma sayfası Facebook, aynı sitenin mobil mesajlaşma penceresini Whatsapp tarzında olduğunu görebilirsiniz.

    @sedirAğacı bahsettiğin "javascript messagechannel()" güzel bir çözüm olabilir fakat hiç araştırmadım. Bu özelliği kendim yapsam nasıl yapardım ben onu açıklayım.

    @dinlex ben projelerimde mesajlaşma sistemini şimdiye kadar hep javascript ile yaptım, bu yüzden olsa gerek bahsettiğin "Yazıyor..." olayını da yine aynı şekilde çözerdim.

    Benim mesajlaşma sistemlerinde tablolarımda şu şekildedir.

    Tablo : mesaj_list
    Sütun : gonderen, alici, okunma, mesaj, tarih

    Yukarıdaki tablo mesajlaşmalar arası sadece kısa özeti tutar. Örneğin mesajlar listesinde gelen giden mesajların kısa bir ön izlemesini gösteririm. Bu yüzden bu tabloda mesajın yalnızca ilk 50 karakterlik kısmı tutulur. Bunun avantajı, mesajlar sayfasında ve site genelinde gelen giden mesajları kontrol etmek için, yeni gelen mesajların sayısını göstermek için koca bir mesaj yığını bulunan asıl "mesajlar" tablom da sorgu çalıştırmamak.

    Tablo : mesajlar
    Sütun : gonderen, alici, mesaj, tur (resim veya text kontrolü için), mesaj, okunma, alici_sil, gonderen_sil, tarih

    Mesaj penceresi açıldığında bu tablodan veriler çekilir.

    Şimdi gelelim asıl konuya, ben yukarıdaki tablolarıma göre bu özelliği yapacak olsam şu şekilde olurdu.

    Mesajlaştığımız sayfada, zaten hali hazırda gördüğümüz mesajdan daha yuksek ID değerine sahip mesajı yeni olarak kabul edip sürekli olarak "mesajlar" tablosundan yeni mesajları çekmiyor muyuz?

    Sayfaya mesaj textarea için sayfaya bir change olayı atarım. Kişi mesaj yazınca veritabanına "gonderen","alici","tarih" gibi olayları peşinen kayıt ederim. Bu kayıt karşı taraf için yeni olduğundan karşı tarafın sorgusu bunu veritabanın da görecek, mesaj alanı boş olduğunda karşı tarafın penceresinde "Yazıyor... " iletisi gösteririm. Hatta javascript change olayına da gerek yok, mesajlaşma penceremde sürekli yeni mesaj kontrolü için bir hali hazırda bir kontrol sayfası çalışmıyor mu? Yeni mesaj kontrolü yaparken, benim text alanıma baksın eğer doluysa gidip benim mesaj yazdığımı da ispiyonlasın. Hiç ek bir sorguya olaya gerek kalmaz. Yani üstteki karşılıklı iki kişi içinde, "yazıyor " olayını benim yeni mesaj kontrol sayfam yapsın.

    Yukarıda mesajı boş olarak kayıt etmiştik, veritabanın da bana gelecek mesaj henüz boş ise, anla ki henüz yazıyor....

    Ha burada, bundan sonrasında sistemin stabilitesi senin kontrolleri ve şartları doğru sağlamana kalıyor. Alıcı sayfası için örneğin : tarih : 10 saniyeden daha eskiyse "Yazıyor..." görüntülenmesin. Eğer mesaj alanı henüz boş ise gösterme. Yani sorguda yalnızca mesaj kısmı dolu olanları çek. Çünkü kişinin mesaj yazarken pencereyi kapattığını düşünün.

    Gönderen için ise, mesaj gönderirken bana ait tüm mesaj içeriği boş satırları sil (çünkü eskiden sayfayı yazarken kapattıysam diye tümü) ve yeni mesajımı kaydet...

    Alıcı ve gönderen için kontrol etmen gereken bir çok şey olabilir, bu bi iki örnek ilk bakışta aklıma gelenler. Üzerinde her ihtimal tartışılıp kurallar oluşturulabilir veya mesajlar yerine mesaj_list tablosundan da yazıyor bilgisi çekilebilir. Benim ilk avantaj olarak aklıma, mesajlaşırken mesajlar tablosuna sürekli bağlantı kurup yeni mesaj kontrolü yaptığımız için ekstra bir tabloya daha bağlanmayayım diye onu seçtim.

    Ayrıca mesajlaşma sisteminde ki yoğunluğa göre yine ekstra çareler düşünülebilir. Örneğin aşırı fazla mesajlaşma yapılan bir sistem olacaksa, yazıyor bilgisi sık sık veritabanına eklenip silindiği için boş yük artabilir ve yoğunluğa göre daha kısa zamanlarda veritabanını uyarlama veya bu boş yükü silme işlemi yapman gerekebilir.

    Ayrıca bu yöntem normal bir web sitede kullanabilsende Facebook veya diğer mesajlaşma uygulamaları gibi yalnızca iletişim amaçlı kullanılan büyük kitleli bir sitede kullanılmayacak kadar verimsiz ve saçma olur bilgine.

    Gece 04:40 tam zamanında bitirdim, derken 04:41 oldu lanet olsun :D inşallah sistemin saati laptopumun saatinden 1 dk geridir :D
     
    dinlex ve sedirAğacı bunu beğendi.
  4. dinlex

    dinlex Aktif Üye

    Kayıt:
    23 Aralık 2016
    Mesajlar:
    341
    Beğenilen Mesajlar:
    88
    Şehir:
    Hatay
    İkinize de teşekkürler...
    @sedirAğacı hocam whatsapp asıl telefonlar için yapılan bir uygulama. Ama bilgisayardan kullanmak için de bir uygulaması var. Tabi bilgisayardan kullanabilmek için sürekli telefona bağlı kalması gerekiyor. Çünkü uygulama sadece telefon numarası üzerinden hizmet (mesajlaşma, sesli ve videolu arama) veriyor. Kullanmanızı tavsiye ederim, kullanışlı bir uygulamadır. İnsanlar artık mail atmak yerine whatsapptan dosya alışverişi yapıyor, ya da telefonla aramak yerine whatsappla sesli/görüntülü arama yapıyor. Örneğin ben son 1 aydır yaptığım bütün aramaları bu uygulama üzerinden yapar oldum parasızlıktan. Kontör yok çünkü, internet yetiyor artık her şey için. Verdiğiniz örnek kodlara da bakacam ama sanırım düşündüğüm yol olacak yine :)

    @izmiralem malesef sistemin saati de 04.41'miş gördüğüm kadarıyla :)) Bu uzun anlatım için teşekkür ederim tekrardan. Benim mesajlaşma sistemi, hatta neredeyse tablodaki sütun isimleri bile sizinkiyle hemen hemen aynı :) Söylediğiniz boş mesaj olayını okurken başta benim de kafama yattı, yapsam mı diye düşündüm ama sizin de söylediğiniz gibi mesajlaşma artarsa -ki benim site mesajlaşma üzerine kurulu- gereksiz boş mesaj yığını oluşur, bu benim hoşuma pek gitmedi. Ayrıca yapılacaksa da kontrolünü iyi yapmak gerekir ki ben henüz o seviyede javascript/jquery bilgisine sahip değilim, altından pek kalkamayabilirim ama normal sistemler için yapılabilir tabi.

    Benim asıl aklıma gelen şey mesaj_bildiri şeklinde farklı bir veritabanına kaydetmek olmuştu.
    Tablo: mesaj_bildiri
    Sütun: id, gonderen, alici, durum, tarih şeklinde daha basit bir şey olursa biraz daha hafif olur diye düşünmüştüm. Ayrıca mesajlar tablosunu da hiç etkilemeyecekti ve istediğim zaman bu tabloyu temizleyebilecektim.

    Direkt iki bilgisayarı/telefonu birbirine bağlayacak bir altyapı olsa ne güzel olurdu. Hiçbir sunucu aracı olmadan direkt cihazlar karşılıklı iletişimde olsa ne güzel olurdu :)
     
  5. izmiralem

    izmiralem Aktif Üye

    Kayıt:
    7 Şubat 2010
    Mesajlar:
    290
    Beğenilen Mesajlar:
    32
    Meslek:
    Bilgisayar Teknik Servis Hizmt.
    Şehir:
    izmir
    Aslında sizin dediğiniz yöntem daha sağlıklı olabilir ayrı bir tablo açmak. Çünkü Yazıyor iletisi için oraya kayıt atıldığında, yazı tamamlanıp mesaj gönderince bu veri silinecek. Bu sebep ile tablo içerisinde ki veri sayısı hep o an kaç kişi mesajlaşıyorsa o kadar sütun ile sınırlı kalacak. Kayıtın bu kadar az olması da sorgulamanın çok daha hızlı dönmesine sebep olacak.
     
  6. dinlex

    dinlex Aktif Üye

    Kayıt:
    23 Aralık 2016
    Mesajlar:
    341
    Beğenilen Mesajlar:
    88
    Şehir:
    Hatay
    @izmiralem Evet, aklıma gelen yöntem o şimdilik. En azından veritabanına kaydetmeden yapamayacağım belli. Pek bir beklentim yok ama yine de araştırmaya devam, belki daha iyi bir yol vardır yine de... :)
     
  7. sedirAğacı

    sedirAğacı Daimi Üye

    Kayıt:
    2 Mart 2016
    Mesajlar:
    897
    Beğenilen Mesajlar:
    237
    Meslek:
    Bilgisayar programcısı.
    Şehir:
    Aydın
    Abilerim, ablalarım yapmayın etmeyin.

    Düşündüğünüz sistem güzel sistem, sağlam sistem işler sistem.

    Ancak siz onu istemiyorsunuz.!!!
    Ben burda klavyeye dokunduğum anda, sokağın karşısında oturan güzeller güzeli Leyla, benim yazmaya başladığımı görsün istiyorsunuz.

    Bu sistemle Leyla sizi anında göremez, üzülür.

    Sizin yöntemde, yazıyı yazıyorsun, önce mahallenin muhtarına gönderip onay alıyorsun, muhtarın çırağı Osman uygun olduğunda mesajı Leylaya götürüyor.
    Olmaz bu sistem. 2 sebepten olmaz. Birincisi, muhtarlık haftasonları kapalı, mesaj her zaman tıkır tıkır gitmez.
    İkincisi, Osman a güven olmaz. Leylada gözü varsa, sizin mesajı olabildiğince erteler. kendi mesajını verir. Leylaya gittiğinde kaş göz yapar, nazar değdirir...

    Leyla sokağın karşısında, niye araya muhtarı sokuyorsun. Hadi muhtarı soktun, Osman la işin ne.???

    Yapmayın etmeyin...

    En hızlı yöntem, aç camı...
    Kızın evi karşıda, bağır abicim...
    Bağırdınmı... Açtı Leyla camı, söyle ne söyleyeceksen söyleyeceğini... Senin azın açıldığında, Leyla bişey diyeceğini anlar... Kalbi küt küt atar...

    Açık havada, tüm mahalleye yayın yapmış olacaksın ama Leyla bu... değer...

    Cam açma yönteminin masaüstü programcılıkta karşılığı P2P (peer to peer) dir... Port üzerinden kanal açılarak haberleşilir...
    Sizin, bu yöntemin web karşılığını bulmanız gerekiyor...

    Varmı yokmu bilmiyorum, o sebeple kesin konuşamadım bir türlü. Ancak gönlümde razı olmuyor. Sizi düşündüğümden değil, yazık değilmi Leyla ya... Her gün Osmanı görürse, gönlü kaymazmı Osman a... Osman ın gönlü kaymazmı Leyla ya... Ya kayarlarsa...???

    Neyse, bildiğiniz gibi yapın... kanal açmayı yaparsanız bende isterim... Web programcısı değilem, masaüstü programcısıyam, o sebeple bu tür şeyleri bende bilmiyorum. Zaten uygulama programcısıyım, yani tablo adamıyım, network, system gibi işlere bende yabanciyom... o sebeple kesin konuşamiyorum...

    Aslında bu konuda uzman biri çıksada, bende aydınlansam, herkes aydınlansa... Furkan biliyodur ama "ne uğraşçam zibidilerle" diyodur...
     
    Son düzenleme: 12 Mayıs 2018
  8. Furkan Onka Uğur

    Furkan Onka Uğur Moderatör Yetkili Kişi

    Kayıt:
    12 Eylül 2008
    Mesajlar:
    3,711
    Beğenilen Mesajlar:
    48
    Şehir:
    Ankara
    sedirAğacı bunu beğendi.
  9. dinlex

    dinlex Aktif Üye

    Kayıt:
    23 Aralık 2016
    Mesajlar:
    341
    Beğenilen Mesajlar:
    88
    Şehir:
    Hatay
    @Furkan Onka Uğur, Ne yapalım hocam, paramız yok ki özel yüzme kursuna gidelim. Kendi çabamızla karşımıza çıkan göletlerde/su kanallarında yüzmeyi öğreniyoruz. Sizin gibi milli yüzücüler yok ki yoldan geçerken bize bir iki tüyo versin böyle. :) Verdiğiniz kaynaklar ingilizce ve biraz uzun anlatılmış o yüzden ben hemen bakamicam. Zaten javascript/node.js bilgim de çok iyi değil, okuma yazmayı yeni öğrenen biri gibi heceliye heceliye okuyorum. Boş bir zamanda google çeviri yoluyla incelerim iyice. Teşekkürler şimdiden... :)
     
  10. izmiralem

    izmiralem Aktif Üye

    Kayıt:
    7 Şubat 2010
    Mesajlar:
    290
    Beğenilen Mesajlar:
    32
    Meslek:
    Bilgisayar Teknik Servis Hizmt.
    Şehir:
    izmir
    @Furkan Onka Uğur vermiş olduğun linkler için teşekkürler. Yöntemleri inceleyeceğim.

    @sedirAğacı Bu konuyu Osman'ı engelleyerek çözebiliriz. if($alici=='osman' or $gonderen=='osman'){ die('Osman Sie... :)'); } Leyla ile aramızda muhtardan başka engel kalmadı.

    O değil de, ben zaten böyle bir sistem henüz yapmayacağım, hep @dinlex 'in başının altından çıktı bunlar :)
     
    sedirAğacı bunu beğendi.
  11. dinlex

    dinlex Aktif Üye

    Kayıt:
    23 Aralık 2016
    Mesajlar:
    341
    Beğenilen Mesajlar:
    88
    Şehir:
    Hatay
    @izmiralem Halla halla, konu açmak da suç olmuş. Ben de konuyu açtığımdan beri fırsat bulamadım uğraşmaya ama şimdiden elimizin altında olsun işte ne zararı var. Bi gayretle işe koyulursak cevap beklemek zorunda kalmayız işte ne güzel. Hepinizden davacıyım :)
     
    sedirAğacı ve izmiralem bunu beğendi.
  12. izmiralem

    izmiralem Aktif Üye

    Kayıt:
    7 Şubat 2010
    Mesajlar:
    290
    Beğenilen Mesajlar:
    32
    Meslek:
    Bilgisayar Teknik Servis Hizmt.
    Şehir:
    izmir
    Tamam @dinlex sen kazandın :) Şaka maka 15 yıldır filan bu tür işler ile uğraşıyorum, buraya 2010 da kayıt olmuşum. Son 8 senedir ileri doğru ne ettiysek burada ki paylaşımlar sayesinde edebildik. Dediğin gibi kenarda dursun.
     
    dinlex ve sedirAğacı bunu beğendi.