NODE.JS Örnek Uygulama - TIC TAC TOE -1 (Server)
Örnek node.js uygulamamız Tic Tac Toe olacak. Node.js kısmı eklenerek Online hale getirmeden önce local çalışan kısmı için arayüzü https://developer.apple.com/library/safari/samplecode/TicTacToe/Listings/tic_tac_toe_html.html
adresinden aldım. Bu şekilde html olarak local çalışır halini göreceksiniz.
Projeyi https://github.com/Gmotes/TicTacToeNodeJS adresinden alabilirsiniz.
Önce server olarak çalışacak node.js dosyamıza bakalım. app.js açıyoruz. (Bazı kısımlar geliştirmeye açık olarak bırakılmış olabilir)
var numberOfPlayer;
var playingGames = [];
var waitingGames = [];
var userX ='';
var userO ='';
function Game(x,y) {
this.gameNo = x;
this.userX = y;
this.userO = '';
this.isStarted = false;
}
var io = require('socket.io').listen(3000);
io.sockets.on('connection', function(socket){
socket.on('login', function(user){
// usernames[user.uid] = user.uid;
socket.username = user.uid;
if (waitingGames.length > 0) {
console.log("You have been directed to waiting game..");
var game = waitingGames[0];
game.userO = user.uid;
waitingGames[0] = game;
socket.join(game.userX);
userX = game.userX;
socket.to(game.userX).emit('readyForGame', game);
}
if (waitingGames.length == 0) {
console.log("No waiting Games new Player created with WaitingGame");
var game = new Game(1,user.uid);
waitingGames[0] = game;
socket.join(user.uid);
console.log('UserUid:'+user.uid);
socket.emit('waitingOtherPlayer', 1);
}
});
socket.on('startGame',function(game) {
socket.to(game.userX).emit('startGame', game,'X');
});
socket.on('moveAndChangeTurn',function(move,turn) {
socket.to(userX).emit('moveAndChangeTurn', move,turn);
});
socket.on('disconnect', function() {
// delete usernames[socket.username];
// io.sockets.emit('updateusers', usernames);
// console.log("Disconnected:"+socket.username);
socket.broadcast.emit('updatechat', 'SERVER', socket.username + ' has disconnected');
socket.leave(socket.room);
});
});
Bu kod ne yapıyor bakalım. 'socket.io' kullanılarak 3000 portu dışarıya açılmış. Socket e gelen 'login' fonksiyonunu karşılıyoruz. waitingGames değişkeni ile aslında daha önce giriş yapmış kullanıcı olup olmadığını kontrol ediyoruz. Bu kullanıcıyı böylece 'waitingGame' içerisine aldık.
Join fonksiyonu ilk kullanıcının ismini kullanarak room açmış oluyoruz. Böylece ilerde sadece bu room içerisindekilere mesajlarımızı ileteceğiz.
Emit fonksiyonu ile 'waitingOtherPlayer' gönderiyoruz client kısmına. Karşılığında ne olduğuna html kısmında inceleyeceğiz.
Başka bir kullanıcı gelmesi durumunda waitingGame içerisine dahil ediliyor.'readyForGame' ile son gelen kullancıya kiminle karşılaşacağı bilgisini gönderiyoruz. Parametrede 'game' objesi ile ;
function Game(x,y) {
this.gameNo = x;
this.userX = y;
this.userO = '';
this.isStarted = false;
}
socket.to(userX).emit('moveAndChangeTurn', move,turn);
Bu kısımda her kullanıcı yaptığı hamleyi server a gönderiyor ve hamle sırasının diğer tarafa geçtiğini söylüyor. Bu biraz istemci tarafında anlamlandırıldığı için server sadece bilgi paylaşımı yapmış oluyor. 2.yazımızda client ile devam edeceğiz.
adresinden aldım. Bu şekilde html olarak local çalışır halini göreceksiniz.
Projeyi https://github.com/Gmotes/TicTacToeNodeJS adresinden alabilirsiniz.
Önce server olarak çalışacak node.js dosyamıza bakalım. app.js açıyoruz. (Bazı kısımlar geliştirmeye açık olarak bırakılmış olabilir)
var numberOfPlayer;
var playingGames = [];
var waitingGames = [];
var userX ='';
var userO ='';
function Game(x,y) {
this.gameNo = x;
this.userX = y;
this.userO = '';
this.isStarted = false;
}
var io = require('socket.io').listen(3000);
io.sockets.on('connection', function(socket){
socket.on('login', function(user){
// usernames[user.uid] = user.uid;
socket.username = user.uid;
if (waitingGames.length > 0) {
console.log("You have been directed to waiting game..");
var game = waitingGames[0];
game.userO = user.uid;
waitingGames[0] = game;
socket.join(game.userX);
userX = game.userX;
socket.to(game.userX).emit('readyForGame', game);
}
if (waitingGames.length == 0) {
console.log("No waiting Games new Player created with WaitingGame");
var game = new Game(1,user.uid);
waitingGames[0] = game;
socket.join(user.uid);
console.log('UserUid:'+user.uid);
socket.emit('waitingOtherPlayer', 1);
}
});
socket.on('startGame',function(game) {
socket.to(game.userX).emit('startGame', game,'X');
});
socket.on('moveAndChangeTurn',function(move,turn) {
socket.to(userX).emit('moveAndChangeTurn', move,turn);
});
socket.on('disconnect', function() {
// delete usernames[socket.username];
// io.sockets.emit('updateusers', usernames);
// console.log("Disconnected:"+socket.username);
socket.broadcast.emit('updatechat', 'SERVER', socket.username + ' has disconnected');
socket.leave(socket.room);
});
});
Bu kod ne yapıyor bakalım. 'socket.io' kullanılarak 3000 portu dışarıya açılmış. Socket e gelen 'login' fonksiyonunu karşılıyoruz. waitingGames değişkeni ile aslında daha önce giriş yapmış kullanıcı olup olmadığını kontrol ediyoruz. Bu kullanıcıyı böylece 'waitingGame' içerisine aldık.
Join fonksiyonu ilk kullanıcının ismini kullanarak room açmış oluyoruz. Böylece ilerde sadece bu room içerisindekilere mesajlarımızı ileteceğiz.
Emit fonksiyonu ile 'waitingOtherPlayer' gönderiyoruz client kısmına. Karşılığında ne olduğuna html kısmında inceleyeceğiz.
Başka bir kullanıcı gelmesi durumunda waitingGame içerisine dahil ediliyor.'readyForGame' ile son gelen kullancıya kiminle karşılaşacağı bilgisini gönderiyoruz. Parametrede 'game' objesi ile ;
function Game(x,y) {
this.gameNo = x;
this.userX = y;
this.userO = '';
this.isStarted = false;
}
gameNo -> statik olarak 1. userX,userO bilgileri var. isStarted kullanılmıyor geliştirmeye açık.
startGame fonksiyonu ise client tarafından gönderiliyor. readyForGame ile oyuna 2.olarak katılan istemci hazır olduğunu server a iletiliyor.
socket.to(game.userX).emit('startGame', game,'X');
ilk kullanıcı ismiyle açılmış room daki herkese (gönderen istemci hariç) başlama mesajı gönderiyoruz. Burda aslında ilk kullanıcıya hadi başla diyoruz. 'X' parametresi de aslında sıranın onda olduğunı söylemiş oluyoruz. X -> ilk kullanıcı O -> ikinci kullanıcı.
socket.to(userX).emit('moveAndChangeTurn', move,turn);
Bu kısımda her kullanıcı yaptığı hamleyi server a gönderiyor ve hamle sırasının diğer tarafa geçtiğini söylüyor. Bu biraz istemci tarafında anlamlandırıldığı için server sadece bilgi paylaşımı yapmış oluyor. 2.yazımızda client ile devam edeceğiz.
Yorumlar
Yorum Gönder