• 12-03-2014, 23:00:15
    #10
    Kimlik doğrulama veya yönetimden onay bekliyor.
    NepenTheS adlı üyeden alıntı: mesajı görüntüle
    Alex Garett'ın hazırladığı set
    https://www.youtube.com/playlist?lis...xNRbcf0uyYzzK_ hemde mongodb kullanarak hazırlanmış, tadından yinmiyor.
    ohaa bunu görmemiştim alex reyiz anlattıysa çözerim ben bunu
  • 12-03-2014, 23:09:57
    #11
    saintx adlı üyeden alıntı: mesajı görüntüle
    Örnek bi' sohbet uygulaması yapacak olan var mı? Cidden bende başlayasım var ama nerden nasıl başlarım orada tıkandım.

    Ben birebir veya grup sohbet yapılabilen bir uygulama yazdım. Uygun vaktim olursa dökümantasyon olarak paylaşacağım.

    Aslında bir önceki mesajda vermiş olduğum işlem kuyruğu mantığıyla sizde hazırlayabilirsiniz. Olay şu kime ne gidecek tanımlamasını doğru yapıldığı taktirde nodejs gayet basit.

    Örnek vermek gerekirse ;

      socket.on('sendMessage',function(messageDetail){});
    diye bir fonksiyonumuz olsun. messageDetail parametlerinizi taşıyan bir dizidir.

    messageDetail içerisinde mesajı ve kime gideceğini gönderdiğinizi varsayalım.

    messageDetail.toUser , messageDetail.Message sizin değerlerinizdir. Bunları işlem kuyruğuna push ederken alıcı kısmına messageDetail.toUser girildiği taktirde mesaj sadece o alıcıya gidecektir. Kuyruk örneğini burdan bakabilirsin.

    Grup sohbet yani oda mantığıda şöyle işler. İkiden fazla kullanıcının oluşturduğu konuşmalara birer isim ataması yaparsın. Örneğin Room1xd. Bir chatUsers nesnesi oluşturup. Bu nesneye çoklu kullanıcı girebilirsin. Örneğin

    chatGroups["Room1xd"].chatUsers gibi.

    ReturnClients : chatGroups["Room1xd"].chatUsers olur kuyrukta. Böylece o konuşmaya dahil tüm kullanıcılar o mesajı görmüş olur.

    Olayın bir kısmıda client tarafında geçiyor tabii ki. Orasıda server'da ihtiyacın olan dataları doğru aktardığın sürece senin programlama kabiliyetine göre şekillenecektir.

    Umarım yardımcı olabilmişimdir.
  • 13-03-2014, 00:03:29
    #12
    @bluemansiiz; çoklu sunucuda çalıştırmak için ne yapabiliriz acaba o benim kafamı kurcalıyor
  • 13-03-2014, 01:27:22
    #13
    dark_way adlı üyeden alıntı: mesajı görüntüle
    Peki "a", sadece "b" ile konuşmak istesre nasıl olcak?




    <html>
      <head>
        <link rel='stylesheet' href='http://netdna.bootstrapcdn.com/bootswatch/3.1.1/united/bootstrap.min.css'>
        <link rel='stylesheet' href='http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css'>
    
        <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
        <script type="text/javascript" src="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
        <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/socket.io/0.9.16/socket.io.min.js"></script>
    
        <script type="text/javascript">
          var socket;
    
          $(document).ready(onDocumentReady);
    
          function onDocumentReady()
          {
            $('#login_form').on('submit', onLoginFormSubmit);
            $('#chat_controls').on('submit', onChatControlsSubmit);
            $('#users_list').on('click', 'li', onCreatePrivateSession);
          }
    
          function onCreatePrivateSession()
          {
            var id = $(this).data('id');
            var username = $(this).find('a').text();
            createTab(id, username)
          }
    
          function onChatControlsSubmit(event)
          {
            sendMessage($('#message_input').val());
            event.preventDefault();
          }
    
          function sendMessage(message)
          {
            message = $.trim(message);
    
            if(!message.length)
              return;
    
            socket.emit("onMessage", currentTab(), message);
            $('#message_input').val('')
            console.log('send message', currentTab(), message)
          }
    
          function onLoginFormSubmit(event)
          {
            var username = $.trim($('#username').val());
    
            if(username.length < 1)
              alert('Kullanici adi bos.');
            else
              connect("http://localhost:3000", { username: username })
    
            event.preventDefault();
          }
    
          function connect(host, data)
          {
            data = data || { };
            socket = io.connect(host, { query: $.param(data) });
            socket.on('connect', onConnect);
            socket.on("onMessage", onMessage);
            socket.on("onSystemMessage", onSystemMessage);
            socket.on('onUserConnect', onUserConnect);
            socket.on('onUserDisconnect', onUserDisconnect);
            socket.on('disconnect', onDisconnect);
            socket.on('error', onError);
          }
    
          function onError(reason)
          {
            alert(reason);
          }
    
          function onConnect()
          {
            $('#login_form').hide();
            $('#rooms').show();
          }
    
          function onDisconnect()
          {
            $('rooms_list').empty();
          }
    
          function onMessage(clientId, username, message)
          {
            appendMessage(clientId, username, message);
          }
    
          function onSystemMessage(message)
          {
            appendMessage(currentTab(), '[Sistem]', message);
          }
    
          function appendMessage(clientId, username, message)
          {
            if(!hasTab(clientId).length)
              createTab(clientId, username)
    
            $('#rooms').find('#' + clientId).append('<li><strong class="username">' + username + "</strong>: " + message)
          }
    
          function createTab(clientId, username)
          {
            $('#rooms_list').append('<li><a id="_' + clientId + '"" href="#' + clientId +'" data-toggle="tab">' + username + '</a></li>');
            $('#rooms').append('<ul class="tab-pane" id="' + clientId + '"></ul>')
            $('#rooms_list li a').last().tab('show')
          }
    
          function deleteTab(clientId)
          {
            $('#rooms_list').find('#_' + clientId).remove();
            $('#rooms').find('#' + clientId).remove();
          }
    
          function hasTab(clientId)
          {
            return $('#rooms').has('#' + clientId);
          }
    
          function currentTab()
          {
            return $('#rooms_list').find('.active a').attr('id').slice(1);
          }
    
          function onUserConnect(id, username)
          {
            console.log('On user connect.', id, username);
            $('#users_list').append(_createUser(id, username))
          }
    
          function _createUser(id, username)
          {
            return '<li data-id="' + id + '"" ><a href="#" class="btn btn-primary">' + username + '</a></li>'
          }
    
          function onUserDisconnect(id)
          {
            console.log('On user disconnect.', id, username);
            $('#users_list').find('li[data-id=' + id + ']').remove();
          }
        </script>
    
        <style>
          .container
          {
            margin-top: 30px;
          }
    
          #main
          {
            height: 550px;
          }
    
          #rooms
          {
            display: none;
          }
    
          #rooms .tab-pane
          {
            height: 85%;
            list-style: none;
            margin: 0;
            padding: 10px;
            border-left: 1px solid #ddd;
            border-right: 1px solid #ddd;
            border-bottom: 1px solid #ddd;
          }
    
          #rooms .tab-pane li
          {
            padding: 10px;
            border-bottom: 1px solid #EFEFEF;
          }
    
          #login_form
          {
            margin-top: 30px;
            padding: 10px;
            border: 1px solid #CCC;
            background: #EFEFEF;
          }
        </style>
       </head>
    
      <body>
        <div class='container'>
    
          <div class='col-md-2'>
            <ul id='users_list' class="nav nav-pills nav-stacked">
    
            </ul>
          </div>
    
          <div id='main' class='col-md-10'>
            <ul id='rooms_list' class="nav nav-tabs">
              <li class="active"><a id='_lobby' href="#lobby" data-toggle="tab">Lobi</a></li>
            </ul>
    
            <div id='rooms' class="tab-content">
              <ul class="tab-pane active" id="lobby">
              </ul>
            </div>
    
            <form id='login_form' class='col-md-6 col-md-offset-3'>
              <div class='form-group'>
                <input id='username' class='form-control fa fa-heart' type="text" placeholder='Kullanici Adi'/>
              </div>
              <div class='form-group'>
                <input class='form-control' type='submit' value='Baglan'>
              </div>
            </form>
          </div>
    
          <div class="col-md-10 col-md-offset-2">
            <form id='chat_controls' class="row">
              <div class='col-md-10'>
                <input id='message_input' class='form-control' type="text"/>
              </div>
              <div class='col-md-2'>
                <input class='form-control' type='submit' value='Gonder'>
              </div>
            </form>
          </div>
      </body>
     </html>
    Coffeescript kodları.

    class Client
      constructor: (@server, @socket, @username) ->
        @server.sendAll('onUserConnect', @id(), @username)
        @_initUsers()
        @_initCallbacks()
    
      _initCallbacks: =>
        @socket.on('onMessage', @_onMessage)
        @socket.on('disconnect', @_onDisconnect)
    
      _initUsers: =>
        @send('onUserConnect', id, client.username) for id, client of @server.clients
    
      _onMessage: (clientId, message) =>
        return @server.sendAll('onMessage', clientId, @username, message) if clientId == 'lobby'
    
        if @server.getClient(clientId)
          @send('onMessage', clientId, @username, message)
          @server.getClient(clientId).send('onMessage', @id(), @username, message)
        else
          @send('onSystemMessage', 'Bu kullanici cevirim disi.')
    
      _onDisconnect: =>
        @server.sendAll('onUserDisconnect', @id())
        delete @server.clients[@id()]
    
      id: =>
        @socket.id
    
      send: (args...) =>
        @socket.emit.apply(@socket, args)
    
      broadcast: (args...) =>
        @socket.broadcast.emit.apply(@socket.broadcast, args)
    
    class Server
      instance = null
    
      @get: ->
        unless instance?
          instance = new @
          instance._init()
    
        instance
    
      _init: ->
        @clients = { }
        @io = require("socket.io")
    
      _initCallbacks: =>
        @io.set 'authorization', @_authorization
        @io.sockets.on "connection", @_onConnect
    
      _authorization: (handshake, callback) =>
        username = handshake.query.username
        handshake.username = username
        for id, client of @clients
          return callback('Bu kullanıcı su an bagli.', false) if client.username == username
        callback(null, true)
    
      _onConnect: (socket) =>
        @clients[socket.id] = new Client(@, socket, socket.handshake.username)
    
      start: =>
        @io = @io.listen(3000)
        @_initCallbacks()
        console.log("Sunucu dinliyor.")
    
      sendAll: (args...) =>
        @io.sockets.emit.apply(@io.sockets, args)
    
      broadcast: (args...) =>
        @io.sockets.broadcast.apply(@io.sockets, args)
    
      getClient: (id) =>
        @clients[id]
    
    Server.get().start()
    Derlenmiş Javascipt kodları.

    // Generated by CoffeeScript 1.6.1
    (function() {
      var Client, Server,
        _this = this,
        __slice = [].slice;
    
      Client = (function() {
    
        function Client(server, socket, username) {
          var _this = this;
          this.server = server;
          this.socket = socket;
          this.username = username;
          this.broadcast = function broadcast() {
            var args;
            args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
            return Client.prototype.broadcast.apply(_this, arguments);
          };
          this.send = function send() {
            var args;
            args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
            return Client.prototype.send.apply(_this, arguments);
          };
          this.id = function id() {
            return Client.prototype.id.apply(_this, arguments);
          };
          this._onDisconnect = function _onDisconnect() {
            return Client.prototype._onDisconnect.apply(_this, arguments);
          };
          this._onMessage = function _onMessage(clientId, message) {
            return Client.prototype._onMessage.apply(_this, arguments);
          };
          this._initUsers = function _initUsers() {
            return Client.prototype._initUsers.apply(_this, arguments);
          };
          this._initCallbacks = function _initCallbacks() {
            return Client.prototype._initCallbacks.apply(_this, arguments);
          };
          this.server.sendAll('onUserConnect', this.id(), this.username);
          this._initUsers();
          this._initCallbacks();
        }
    
        Client.prototype._initCallbacks = function _initCallbacks() {
          this.socket.on('onMessage', this._onMessage);
          return this.socket.on('disconnect', this._onDisconnect);
        };
    
        Client.prototype._initUsers = function _initUsers() {
          var client, id, _ref, _results;
          _ref = this.server.clients;
          _results = [];
          for (id in _ref) {
            client = _ref[id];
            _results.push(this.send('onUserConnect', id, client.username));
          }
          return _results;
        };
    
        Client.prototype._onMessage = function _onMessage(clientId, message) {
          if (clientId === 'lobby') {
            return this.server.sendAll('onMessage', clientId, this.username, message);
          }
          if (this.server.getClient(clientId)) {
            this.send('onMessage', clientId, this.username, message);
            return this.server.getClient(clientId).send('onMessage', this.id(), this.username, message);
          } else {
            return this.send('onSystemMessage', 'Bu kullanici cevirim disi.');
          }
        };
    
        Client.prototype._onDisconnect = function _onDisconnect() {
          this.server.sendAll('onUserDisconnect', this.id());
          return delete this.server.clients[this.id()];
        };
    
        Client.prototype.id = function id() {
          return this.socket.id;
        };
    
        Client.prototype.send = function send() {
          var args;
          args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
          return this.socket.emit.apply(this.socket, args);
        };
    
        Client.prototype.broadcast = function broadcast() {
          var args;
          args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
          return this.socket.broadcast.emit.apply(this.socket.broadcast, args);
        };
    
        return Client;
    
      })();
    
      Server = (function() {
        var instance;
    
        function Server() {
          var _this = this;
          this.getClient = function getClient(id) {
            return Server.prototype.getClient.apply(_this, arguments);
          };
          this.broadcast = function broadcast() {
            var args;
            args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
            return Server.prototype.broadcast.apply(_this, arguments);
          };
          this.sendAll = function sendAll() {
            var args;
            args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
            return Server.prototype.sendAll.apply(_this, arguments);
          };
          this.start = function start() {
            return Server.prototype.start.apply(_this, arguments);
          };
          this._onConnect = function _onConnect(socket) {
            return Server.prototype._onConnect.apply(_this, arguments);
          };
          this._authorization = function _authorization(handshake, callback) {
            return Server.prototype._authorization.apply(_this, arguments);
          };
          this._initCallbacks = function _initCallbacks() {
            return Server.prototype._initCallbacks.apply(_this, arguments);
          };
        }
    
        instance = null;
    
        Server.get = function get() {
          if (instance == null) {
            instance = new this;
            instance._init();
          }
          return instance;
        };
    
        Server.prototype._init = function _init() {
          this.clients = {};
          return this.io = require("socket.io");
        };
    
        Server.prototype._initCallbacks = function _initCallbacks() {
          this.io.set('authorization', this._authorization);
          return this.io.sockets.on("connection", this._onConnect);
        };
    
        Server.prototype._authorization = function _authorization(handshake, callback) {
          var client, id, username, _ref;
          username = handshake.query.username;
          handshake.username = username;
          _ref = this.clients;
          for (id in _ref) {
            client = _ref[id];
            if (client.username === username) {
              return callback('Bu kullanıcı su an bagli.', false);
            }
          }
          return callback(null, true);
        };
    
        Server.prototype._onConnect = function _onConnect(socket) {
          return this.clients[socket.id] = new Client(this, socket, socket.handshake.username);
        };
    
        Server.prototype.start = function start() {
          this.io = this.io.listen(3000);
          this._initCallbacks();
          return console.log("Sunucu dinliyor.");
        };
    
        Server.prototype.sendAll = function sendAll() {
          var args;
          args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
          return this.io.sockets.emit.apply(this.io.sockets, args);
        };
    
        Server.prototype.broadcast = function broadcast() {
          var args;
          args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
          return this.io.sockets.broadcast.apply(this.io.sockets, args);
        };
    
        Server.prototype.getClient = function getClient(id) {
          return this.clients[id];
        };
    
        return Server;
    
      })();
    
      Server.get().start();
    
    }).call(this);
  • 13-03-2014, 01:56:21
    #14
    @PsiCat; paylaşım için teşekkürler. Böyle bi anda yığınla kod epey karışık geldi ama incelicem. Aslında amacım sadece chat falan değil, nodeyi öğrenmek istiyorum. Php ile harmanlayıp ortaya karışık iyi bişeyler çıkarmakta epey işime yarayacak sanırım. "fatihsarac"ın paylaştığı video serisi çok işime yaradı. Kısa süre içinde "NepenTheS"in paylaştığı linteki videolara da göz atacağım.

    Katkıda bulunan herkese teşekkürler.
  • 13-03-2014, 08:53:06
    #15
    dark_way adlı üyeden alıntı: mesajı görüntüle
    @PsiCat; paylaşım için teşekkürler. Böyle bi anda yığınla kod epey karışık geldi ama incelicem. Aslında amacım sadece chat falan değil, nodeyi öğrenmek istiyorum. Php ile harmanlayıp ortaya karışık iyi bişeyler çıkarmakta epey işime yarayacak sanırım. "fatihsarac"ın paylaştığı video serisi çok işime yaradı. Kısa süre içinde "NepenTheS"in paylaştığı linteki videolara da göz atacağım.

    Katkıda bulunan herkese teşekkürler.
    node.js'yi php ile harmanlamak çok zahmetli ve yapılmaması gereken bir iş.

    ha illa ben deneyeceğim, uğraşacağım dersen http://elephant.io/ burada socket.io ile iletişim kuran bir php sınıfı mevcut. direkt olarak oluşturduğun node serverına veri gönderebiliyor. fakat php ile her bağlantı yaptığında node tarafından atanan değerler (ID değeri gibi düşünün) değiştiği için o kullanıcı 2. isteği yaptığında farklı birisiymiş gibi algılanıyor.

    zateb elephant.io daki "future" bölümüne bakarsan demişler ki; Better callback management

    yani daha iyi bir geri dönüş yönetimi yapacağız.
  • 13-03-2014, 11:17:26
    #16
    saintx adlı üyeden alıntı: mesajı görüntüle
    @bluemansiiz; çoklu sunucuda çalıştırmak için ne yapabiliriz acaba o benim kafamı kurcalıyor
    Eğer çoklu sunucundan kastın fiziksel olarak bir sunucu ise. Kullanıcı bağlandığında bağlandığı sunucuyu DataBase üzerinde tut. Ve kullanıcı bağlandığında tüm bilgilerini bir dizi içerisinde tutarsan o kullanıcıya etkileşim yapmak isteyen diğer kullanıcılar o sunucuya emit yapabilir.

    Veyahut araya bir router yazarak geleni gideni ortak havuzlarda tutup. Daha sonra dağıtabilirsin ki bu daha ideal ve doğru yöntem.

    fatihsarac adlı üyeden alıntı: mesajı görüntüle
    node.js'yi php ile harmanlamak çok zahmetli ve yapılmaması gereken bir iş.

    ha illa ben deneyeceğim, uğraşacağım dersen http://elephant.io/ burada socket.io ile iletişim kuran bir php sınıfı mevcut. direkt olarak oluşturduğun node serverına veri gönderebiliyor. fakat php ile her bağlantı yaptığında node tarafından atanan değerler (ID değeri gibi düşünün) değiştiği için o kullanıcı 2. isteği yaptığında farklı birisiymiş gibi algılanıyor.

    zateb elephant.io daki "future" bölümüne bakarsan demişler ki; Better callback management

    yani daha iyi bir geri dönüş yönetimi yapacağız.
    Aslına bakarsanız her socket bağlantısı, disconnect olmadığı sürece aynı socketi kullanmaya devam eder. Yani ikinci isteği yapması onu farklı bir kullanıcı olarak göstermez. Elimizde de kullanıcıların socket bilgisi olması dağıtım için yeterlidir. " Kimden(server(data)) -> Kime(kullanıcı & socket) " Kullanıcı tanımlama işlemlerini nodeJS tarafında header olarak bir oauth yapılabilir.

    Tabii söylediğiniz gibi hazır sınıflar hem işlem kolaylığı hemde ara bağlantılar için hantal fonksiyonlar yazmaktansa kullanılabilir.
  • 13-03-2014, 11:20:40
    #17
    bluemansiiz adlı üyeden alıntı: mesajı görüntüle
    Eğer çoklu sunucundan kastın fiziksel olarak bir sunucu ise. Kullanıcı bağlandığında bağlandığı sunucuyu DataBase üzerinde tut. Ve kullanıcı bağlandığında tüm bilgilerini bir dizi içerisinde tutarsan o kullanıcıya etkileşim yapmak isteyen diğer kullanıcılar o sunucuya emit yapabilir.

    Veyahut araya bir router yazarak geleni gideni ortak havuzlarda tutup. Daha sonra dağıtabilirsin ki bu daha ideal ve doğru yöntem.



    Aslına bakarsanız her socket bağlantısı, disconnect olmadığı sürece aynı socketi kullanmaya devam eder. Yani ikinci isteği yapması onu farklı bir kullanıcı olarak göstermez. Elimizde de kullanıcıların socket bilgisi olması dağıtım için yeterlidir. " Kimden(server(data)) -> Kime(kullanıcı & socket) " Kullanıcı tanımlama işlemlerini nodeJS tarafında header olarak bir oauth yapılabilir.

    Tabii söylediğiniz gibi hazır sınıflar hem işlem kolaylığı hemde ara bağlantılar için hantal fonksiyonlar yazmaktansa kullanılabilir.

    tamam işte ondan bahsediyorum ben de. php ile 2. bir işlemi yapabilmek için node'dan nasıl disconnet olmayacağız? bildiğiniz bir yöntem varsa paylaşırsanız sevinirim, benim de en çok takıldığım mevzu bu.
  • 13-03-2014, 11:28:42
    #18
    Yok hocam php ile harmanlamak derken genel anlamda projeyi php ile kodlayıp nodenin de nimetlerinden faydalanmak anlamında söyledim (bu da anlamı pek değiştirmedi gerçi :] ). Yani nodenin express kütüphanesiydi sanırım "http" server özelliğini hiç kullanmayıp onun yerine php ile kodlamak ama projede "chat" olcaksa mesela bunu node ile yapmak ve "chat" kısmına php ile hiç müdahale etmeden (sokete hiç bulaşmadan), sadece php user sessionlarını nodeye göndererek bir yapı oluşturmanın sakıncası olmaz görüşündeyim ama var derseniz de tecrübenize güveniyorum. Veritabanı işlemleri projeye göre uygun olanla yapılır falan..

    Hala çok acemilik çekiliyorum ve tüm özellikleri hakkında bilgi sahibi olmadığım için henüz kafamda oluşmuş bi proje de yok tabi ama örneğin sadece normalde clientte çalıştırabildiğim ama çok kolay çalınabildiği için yapmaktan vazgeçtiğim siteleri jsyi node sayesinde server tarafında kullanabilirim mesela,
    ya da grafiklere hakimiyeti hakkında bişey görmedim henüz ama phpye oranla daha iyiyse grafik işlemlerinin ağırlıklı olduğu bi projede grafik işlemlerini node ile yapabilirim. Her ne kadar wallpaper için çok gereksizse de (örnek vermek adına) , imzamdaki sitedeki grafik işlemlerini node ile çok daha ileri düzeye taşıyabilceksem mesela, daha uygun bi alanda daha gelişmiş ve ana dili php olan bi sitede sadece grafik işlemlerini node ile yapmak gibi.... lıılılılı toparlayamadım