Client-Server oyun programlamada, hatta aslında direk olarak uygulama programcılığı diyelim, karşılaşılan zorluklardan en büyüğü de sanırım yaptığınız programları -uygun koşullar altında- test edebilmek. Ve hayır, evinizde bilgisayarınız başında oturup 127.0.0.1 üzerinde server çalıştırıp daha sonra yine 127.0.0.1 üzerinden bir client ile server a bağlanarak yaptığınız test basit fonksiyonellik testinin ötesine geçmiyor :/
Özellikle gerçek zamanlı tepkilerin önemli olduğu bir proje üzerinde çalışıyorsanız, yani pratik olarak tur tabanlı olmayan herhangi bir oyunu kastediyorum, paket gecikmesi, paket kaybı, bağlantı kopması, bağlantı hızındaki dalgalanmalar gibi tonla şeyi de test etmeniz gerekmekte.
Çözüm nedir; tabi ki ilk akla gelen şey test ortamını gerçek hayata yakınlaştırmak. Yani normalde oyunumuzun server ını nasıl internet üzerinde bir makinada çalıştırıp dışarıdaki başka makinalardan buna bağlanacak isek, test sırasında da aynen bu işlemi gerçekleştirebileceğimiz bir kurulum hazırlamak. Bunu yapabilmek için birkaç seçeneğimiz var:
1) Bir arkadaşı kandırıp makinasında bizim server ı çalıştırmasını sağlamak ve evimizden bu server a bağlanmak.
2) Okul, işyeri gibi devamlı internete bağlı güvenilir ve kolay erişilebilen bir yerde kimseye belli etmeden server uygulamamızı çalıştırmak ve aynı şekilde dışarıdan buna bağlanmak.
3) Parayı bastırıp bir dedicated sunucu kiralamak ve server ı bunun üzerinde çalıştırmak.
4) Benim şu anda uyguladığım -evden çıkma, pijamanı çıkarma, testini oturduğun yerden yap, kısa fikrinden yola çıkan yöntemi kullanmak :)
Bu seçeneklerin artıları-eksileri üzerinde kısaca bir şeyler söylememiz gerekirse;
1. yöntem bir arkadaşa ve onun internet bağlantısı + bilgisayarına gereksinim duyduğu için aslında kısa vadede uygulanabilir gözükse de test sürecinin uzadığı durumlarda (ki bu çok doğal) pek te uygulanabilir bir pratikliğe sahip olmuyor. Ayrıca fiziksel olarak server bilgisayarına erişiminiz olmadığı içinde programı yeniden derleme, kurma, tekrar başlatma, müdahele etme gibi şeyler bir ızdırap haline dönüşüyor.
2. yöntem 1. yönteme çok benzeyen fakat aradan insan faktörünü (arkadaş) çıkardığı için eğer uygulanabilecek bir ortam oluşturulabiliyorsa (okul/iş vb..) daha iyi bir seçenek gibi gözüküyor. Fakat aynı şekilde uzaktaki bir makinayı yönetme zorlukları burada da karşımıza çıkıyor. Ayrıca böyle bir server ı işletmenin çoğu zaman yasadışı bir girişim olacağını da gözönünde tutmak lazım :)
3. yöntem; en ideal test ortamlarından birini sağlar. Hem güvenli hem de kaliteli + ciddi bir test imkanı sunar, fakat bu gülün dikeni de dedicated sunucu kiralama ve işletme maliyeti. Nereden baksanız ayda 100$ dan aşağıya olmayan bir bedeldir bu. Ayrıca uzakta olan bir makinayı yönetme işlemi de diğer seçeneklerde olduğu kadar zor olmasa da yine de bize hız kaybettirecek bir engel olarak karşımızda durmakta.
Evet, geldik favori yöntemimize :).. Bu yöntem öyle bir yöntem ki, hem server i yanıbaşımızda tutacağız, hem de internet üzerinden haberleşmenin tüm negatif etkilerini simüle edebileceğiz. Anahtar kelimelerimiz: tunneling, ssh, socks, packet relaying
Nedir? Server ı ve cient ı kendi makinanızda (evinizde) çalıştırırken client ile internet üzerindeki başka bir makina üzerinden server ınıza bağlanmak. Yani şöyle birşey: client paketleri bu dışarıdaki makinaya gönderecek, bu makinaya gelen paketler ise internet üzerinde kısa bir tur attıktan sonra tekrar evinizdeki server a yönlendirilecek. Böylelikle yerinizden kıpırdamadan internet bağlantısının yol açtığı tüm sorunları test edebileceksiniz.
Çok güzel, fakat uygulama nasıl olacak, bu internette herhangi bir yerde olan 3. -ara- makinaya erişim nasıl gerçekleşecek? Burada elimizin altında birçok seçenek var. Durumunuza uyanı seçebilirsiniz.
1. Programınızın network katmanını SOCKS protokolü uyumlu yazmak. Daha sonra lokal olarak çalıştıracağınız bir socks server aracılığı ile public bir network üzerinden paketlerinizi kendi bilgisayarınıza yönlendirmek. Programınızı socks uyumlu yazmak zor birşey değil. Uygulama platformunuza uyan bir socks kütüphanesi edinip normal socket fonksiyonları yerine bu kütüphanenin fonksiyonlarını çağırmanız yeterli olacaktır. Zaten çoğu socks kütüphanesi de standart socket fonksiyonlarının birebir eşleniklerini (isim ve kullanım şekli olarak) sağladıkları için bu işi yapmak çocuk oyuncağı denilebilir. Herkese açık bir ağ için ise Tor gibi bir serbest çözümü, ya da windows platformunda HTTP-Tunnel yazılımı ve network ünü önerebilirim.
2. Packet Relaying. Socks TCP bağlantılarını destekler. UDP kullanmak istiyorsanız packet relaying olarak adlandırılan yöntemi kullanmanız gerekmekte. Uygulanan yöntem ise basit olarak; etraftan bir packet relayer programı edinmek, ki internette birçoğu var (ayrıca kendinizde yazabilirsiniz, basit bir program), ve bunu karşı bir server üzerinde çalıştırmak. Evet bu şekilde de yine bir 3. bilgisayara tam erişim edinmek durumunda kalıyorsunuz ama şunu belirtmekte fayda var; packet relayer programları ortalıklarda pek gözükmeyen, çalışıp çalışmadığı belli olmayan, insanı rahatsız etmeyip işini verimli biçimde yapan basit (ve genelde kullanıcı arayüzü olmayıp arka planda çalışan) uygulamalardır. Yani böyle bir programcığı bir arkadaşınızın devamlı olarak arka planda çalıştırmayı kabul etmesi çok daha kolay olacaktır. Bu programdan seken paketler internette dolaşıp yine sizin bilgisayarınızda çalışan server a ulaşacak, böylelikle testinizi yapmış olacaksızın. Ayrıca kodunuzu da değiştirmeniz gerekmiyecek, sadece bağlantı noktanız ile ilgili bazı konfigürasyon dosyalarınızı güncellemeniz yeterli olacak. Ayrıca sadece UDP ile de sınırlı değilsiniz, isterseniz TCP protokolünü destekleyen relayer larda kullanabilirsiniz.
3. Bağlantı protokolünüz HTTP ise, herkese açık bir anonymous proxy üzerinden kendi bilgisayarınıza bağlanmak. Özellikle web yabanlı bir uygulamayı evinde çalıştırdığı server ile test edenler bu yöntemi kolaylıkla kullnabilirler. HTTP request header ında yapacağınız ufak bir değişiklik ile kolaylıkla bir HTTP proxy üzerinden kendinize bağlanabilirsiniz. Internette bu konu ile ilgili birçok kaynak bulunmakta.
4. Üzerinde çalıştığınız platformun SOCKS desteğinden faydalanmak. Hehe, en zahmetsiz olan ve benim uyguladığım yöntem... Aslında 1. yöntem ile çalışma mantığı aynı, sadece değişen şu: zaten kullandığınız yazılım platformu/dili socks desteği sağlıyor ise bunu aktif hale getiriyorsunuz o kadar. Yani kodunuzda bir değişikliğe gerek kalmıyor. Eğer java kullanıyor iseniz bu iş 3 (üç) fonksiyon çağrısı yapmak kadar kolay. Ya da uygulama platformunuz C/C++ fakat RakNet gibi üst seviye bir network kütüphanesi de kullanıyorsanız bildiğim kadarıyla bunlarında içinde socks desteği var. Bu konuyu kendiniz araştırmanız gerekmekte. Ben şu anda Java ile lokal HTTP-Tunnel SOCKS server üzerinden yine bu firmanın serbest ağını kullanarak kendi bilgisayarıma bağlanıyorum. Bu bağlantının maliyeti 250-500 msn gecikme süresi ve ortalama 10Kb/sn lik bir bant genişliği oluyor. Yani -yavaş- bir internet bağlantısını simüle edebiliyorum :)
Evet, durumunuza en çok uyan yöntemi seçmek size kalmış. Bu yöntemler tabii ki yıllardır biliniyor ve uygulanıyor, ama illa ki şu ana kadar öğrenmemiş olanlar olacaktır, eh onlarda artık öğrendiğine göre testlerimize başlayabiliriz. Hepinize az böcüklü test süreçleri diliyorum. :)
deniz.
Son yorumlar
17 yıl 18 hafta önce
17 yıl 19 hafta önce
17 yıl 19 hafta önce
17 yıl 19 hafta önce
17 yıl 19 hafta önce
17 yıl 19 hafta önce
17 yıl 19 hafta önce
17 yıl 19 hafta önce
17 yıl 20 hafta önce
17 yıl 20 hafta önce