Android ve Php ile Basit Client-Server Uygulaması
Android uygulama geliştirirken, çoğu zaman veritabanına ihtiyaç duymuşuzdur. Basit uygulamalarda veritabanı ihtiyacımızı ya dosyalar ile yada local veritabanlarıyla halledebiliriz. Ancak büyük projelerde ve ortak veritabanına ihtiyaç duyan uygulamalarda local veritabanları ihtiyaçlarımızı karşılamamaktadır.
Büyük projelerde genelde bu problemlere karşı web servisler kullanılır. Bu servisler sayesinde server ve client arasında XML-RPC (is a remote procedure call (RPC) protocol which uses XML to encode its calls and HTTP as a transport mechanism ) çağrıları olur. Bizim anlatacağımız konuda server, uzak sunucuda bulunan php dosyamız, client ise android uygulamamız olacak.
Çalışma mantığımız, server tarafında HTTP POST ile gelen komutları kabul eden ve geriye veri stringi döndüren bir script yazmak. Bu sayede client yani android uygulamamız web sayfalarında olduğu gibi servere çağrıda bulunabilir ve ona veri gönderebilir.
Bizim yapacağımız uygulamada veriler HTTP üzerinden gönderileceği için tam bir güvenlik sağlamak mümkün değildir. Eğer önemli ve gizli bilgi gönderiyorsanız HTTPS kullanmalısınız.
Uygulamamıza başlamadan önce şu konularda bilgi sahibi olduğunuzu varsayıyorum: Java, Android SDK, Php, running php on web server
Uygulama:
Uygulamamız serverdan aldığı bazı otomobil modellerini ekranda listeleyecek ve biz herhangi bir model tıkladığımızda bu modelin hangi markaya ait olduğunu serverdan alarak Toast üzerinde gösterecek.
Uygulamamızın ekran görüntüsü:
Server – PHP Script
Öncelik php ile server ımızı hazırlayalım. Hazırladığımız script iki tane komuta göre çalışacak. getModelList, getBrandName
getModelList, Herhangi bir parametre almayacak ve virgul ile ayrılmış modellerin listesini döndürecek.
getBrandName, Hangi modelin markası isteniyorsa o model parametre olarak yollanacak ve marka değeri döndürülecek.
Şu şekilde server.php dosyamızı hazırlıyoruz.
<?php //komutumuzu alıyoruz $command = $_REQUEST['command']; //hangi işlevi gerçekleştireceğimize karar veriyoruz. if($command == "getModelList") { echo "symbol,golf,focus,clio,mondeo,polo,megane,jetta,fiesta"; } else if($command=="getBrandName") { $model = $_REQUEST['model']; if($model =="megane" || $model =="symbol" || $model =="clio") echo "Renault"; else if($model =="fiesta" || $model =="focus" || $model =="mondeo") echo "Ford"; else if($model =="polo" || $model =="golf" || $model =="jetta") echo "volkswagen"; } else echo ""; //www.kodmerkezi.net ?> |
Örnek olarak bu scriptimizi http://kodmerkezi.net/server.php?command=getModelList ile deneyebilirsiniz.
Client – Android Uygulamamız
Uygulamamız iki class dan oluşacak.
Class: ServerInterface: Bu sınıfımız server ile iletişimi sağlayacak olan sınıfımızdır. İçinde static metodlar bulunmaktadır. executeHttpRequest metodumuz en çok işi yapan metoddur. İki tanede isteiğimi oluşturacak stringleri hazırlayan getBrandName ve getModelList metodlarımız bulunmaktadır.
package com.kavakci.clientServer; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; /** * @author Gürcan Kavakçı */ public class ServerInterface { // Declared Constants public static final String SERVER_URL = "http://www.kodmerkezi.net/server.php"; /** * model listesini çekiyoruz * @return virgulle ayrılmış model listesi. */ public static String getModelList() { String data = "command=" + URLEncoder.encode("getModelList"); return executeHttpRequest(data); } /** * Servera komut gönderip almak için yardımcı bir fonksiyon. * @param gönderilen komut. * @return String server tarafından döndürülen cevap. */ private static String executeHttpRequest(String data) { String result = ""; try { URL url = new URL(SERVER_URL); URLConnection connection = url.openConnection(); /* * Bu bağlantıya input gönderip output alabildiğimizden emin oluyoruz * Caching modunu disable ediyoruz, böylece her zaman güncel verileri * çekeceğiz. * Son olarak bağlantı tipimizi belirtiyoruz. */ connection.setDoInput(true); connection.setDoOutput(true); connection.setUseCaches(false); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // POST ile veriyi yolluyoruz DataOutputStream dataOut = new DataOutputStream(connection.getOutputStream()); dataOut.writeBytes(data); dataOut.flush(); dataOut.close(); // serverın cevabını alıyoruz DataInputStream dataIn = new DataInputStream(connection.getInputStream()); String inputLine; while ((inputLine = dataIn.readLine()) != null) { result += inputLine; } dataIn.close(); } catch (IOException e) { e.printStackTrace(); result = null; } return result; } public static String getBrandName(String model) { // TODO Auto-generated method stub String data = "command=" + URLEncoder.encode("getBrandName"); data += "&model=" + URLEncoder.encode(model); return executeHttpRequest(data); } } |
Class: AndroidListClient: Programımızın başlangıç noktasını oluşturmaktadır. Öncelikle boş bir listview ile programımızı başlatıyoruz. Arkaplanda çalışan thread gerekli listeyi serverdan çekiyor. Daha sonra veriler gelince listemiz yenileniyor ve bilgiler listeye dolduruluyor. Ayrıca herhangi bir liste elemanın tıklandığını anlamak için clicklistener oluşturuyoruz.. Böylece kullanıcı bir model tıkladığında biz arka planda çalışan thread sayesinde ilgili markayı serverdan çekiğ Toast ile ekrana basacağız.
package com.kavakci.clientServer; import java.util.StringTokenizer; import android.app.ListActivity; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; /** * @author Gürcan Kavakçı */ public class AndroidListClient extends ListActivity { // Instance Variables private AndroidListClient mainActivity = null; /** Called when the activity is first created. */ @SuppressWarnings("unchecked") public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Diğer threadlara geçtiğimizde kullanacağız mainActivity = this; // initialList şimdilik boş duracak daha sonra serverdan gelen bilgiyle dolduracağız String[] initialList = {""}; // ListActivity için gereken veriyi sağlıyoruz ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list, initialList); this.setListAdapter(adapter); /* * item click listener tanımlıyoruz. * Böylece hangi modele tıklandı ise onun markasını getireceğiz * ve Toast ile göstereceğiz */ ListView lv = this.getListView(); lv.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { /* * Yeni bir thread oluşturuyoruz. İsmi GetBrandNameTask * Bu thread ile arka planda marka isimlerini çekeceğiz ve * programımızı bloke etmemiş olacağız. */ (new GetBrandNameTask()).execute((Object)((TextView)view).getText()); } }); /* * GetListTask adında thread oluşturuyoruz. Bu thread ile tüm model listesini * program çalışırken arkaplanda çekeceğiz ve ana UI bloke olmamış olacak */ (new GetListTask()).execute((Object)null); } @SuppressWarnings("unchecked") private class GetListTask extends AsyncTask { /** * http isteği oluşturuyoruz ve cevabı döndürüyoruz */ protected String doInBackground(Object... args) { return ServerInterface.getModelList(); } /** * Cevapdan gelen sonucu parse ediyoruz. list view için bir adapter oluşturuyoruz */ protected void onPostExecute(Object objResult) { // string ile işlem yaptığımızı kontrol ediyoruz if(objResult != null && objResult instanceof String) { String result = (String) objResult; // parse işlemi tamamlanan string listesini tutuyor String[] responseList; // "," e göre ayırma işlemini yapacağız StringTokenizer tk = new StringTokenizer(result, ","); // dönen cevabın uzunluğunu tutuyoruz responseList = new String[tk.countTokens()]; // string array oluşturuyoruz int i = 0; while(tk.hasMoreTokens()) { responseList[i++] = tk.nextToken(); } // ListActivity için gerekli olan veriyi sağlamış oluyoruz. ArrayAdapter<String> newAdapter = new ArrayAdapter<String>(mainActivity, R.layout.list, responseList); mainActivity.setListAdapter(newAdapter); } } } /** * Bu threadi markaları almak için kullanacağız * */ @SuppressWarnings("unchecked") private class GetBrandNameTask extends AsyncTask { /** * http isteği oluşturuyoruz ve dönen sonucu döndürüyoruz */ protected String doInBackground(Object... args) { if(args != null && args[0] instanceof String) { String animal = (String) args[0]; return ServerInterface.getBrandName(animal); } else { return null; } } /** * Donen sonucu Toast üzerinde gösteriyoruz */ protected void onPostExecute(Object objResult) { // stringle işlem yaptığımızdan emin oluyoruz if(objResult != null && objResult instanceof String) { String result = (String) objResult; Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show(); } } } } |
Bu işlemleri yaparken eş zamanlı olmayan (asynchronous) metodlar kullandık. Çünkü arka planda server ile iletişimin ne kadar süreceğini bilmiyor olmamız. Bunları öğrendikten sonra php ile database bağlantısı yapıp cihazınıza database den gelen verileri yollayabilir ve cihazdan aldığınız verileri database e kaydedebilirsiniz.
Son olarak androidmanifest.xml dosyasında internet erişimine izin verdiğinizden emin olun
<uses-permission android:name="android.permission.INTERNET"></uses-permission> |
Kodu ve Php Scripti buradan indirebilirsiniz.
Yardımcı Kaynak: http://www.hassanpur.com
Bunlara da Göz Atmak İsteyebilirsiniz.
<<< Önceki: E ‘ NFA to DFA Converter (E ‘ Nfa dan Dfa ya Çeviri Yapan Java Otomata)
Sonraki: Regular Expression to DFA Converter (Düzenli İfadeden Dfa ya Çeviri Yapan Java Otomata) >>>
Merhabalar, yazınızı çok yararlı buldum öncelikle paylaşımınız için teşekkür ederim. Yeni yeni android ile uğraşıyorum Bir şey sormak istiyorum ben kodu indirdim ancak açamadım nasıl açabileceğimi tarif edebilir misiniz?
Esma,
İndirdiğin dosyayı çıkardıktan sonra içinde server.php ve android klasörü olacak. server.php yi çalıştırmak istediğin web alanına atacaksın. Android dosyasını ise Eclipse import edeceksin. Gerekli programların tam ise(android sdk, java sdk…) programın çalışacaktır.
peki tekrar deneyeceğim, çok teşekkürler..
bu sefer oldu teşekkür ederim, şuan çalıştırdığımda projeyi sizin sitenizden araba bilgilerini alarak çalıştırıyor. benim buna benzer proje yapmam gerekiyor da o zaman öncelikle bir site mi yapmalıyım sunucu görevi görsün diye orasını anlayamadım :/
Site değil sadece server tarafında yapılacak işlemleri (databaseden veri çekme vs) halledecek olan dosyayı (ben server.php yazdım) yazman gerekiyor. Herhangi bir sitenin altına attığında benimkine nasıl uzaktan erişiyorsan, kendi yazdığın server dosyasına da o şekilde erişeceksin. Böyle bir siten yoksa kendi bilgisayarına server (wapmserver örneğin) kurarak (sadece senin bilgisayarda çalışmak kaydıyla) çalıştırabilirsin.
http://i.imgur.com/uOSc9.png
şeklinde sıkıntı yaşıyorum. listview oluşturdum ama bu sorun neden kaynaklanıyor çözüm bulamadım…
Merhaba Selim,
Resimden sorunu anlayamadım. Herhangi bir hata ikonu da yok. Nerede sorun yaşıyorsun.
Merhaba ,Esra nın sorusuna cevap verirken yazmışsınız wampserverla yapılabileceğini, bu wampserver da bizim veritabanımız mi olacak server.php ile siteden veri cekmek yerine wampserverdan mı veri çekicek?bu wampserver la nasıl yapılacağı konusunu biraz daha anlatır mısınız?
Merhaba Ceren,
Uygulamayı geliştirirken, geçici olarak kendi bilgisayarını server olarak kullanabilirsin. Bunun için wampserver kullanabilirsin. Wampserver ile localhostta çalışabilirsin. Ancak yazdığın uygulama sadece kendi bilgisayarında çalışır.
Sanırım android üzerine en faydalı bilgiler bu sitede yer alıyor.
Merhabalar,
Bu yazınızda server.php i web alanına atacaksınız demişsin, tam olarak nasıl yapıyoruz bunu açıklayabilir misiniz? uygulamayı çalıştırma adımlarını söylerseniz sevinirim. Teşekkürler.
Konuda bahsettiğimiz php dosyasını, bir hosting’e atacaksınız. Mesela http://www.ferhat.com şeklinde bir siteniz var. Bu sitenizin dosyalarının olduğu bölüme server.php dosyasını da koyarsanız. Artık sizin server kısmınız http://www.ferhat.com/server.php olur ve uygulamaya bu domaini verirsiniz. Mesela biz http://www.kodmerkezi.net altına bu dosyayı koyduk ve şu şekilde erişebilirsiniz. http://www.kodmerkezi.net/server.php ancak boş bir sayfa çıkacak karşınıza eğer şu url i yazarsanız modeller gelecektir. http://www.kodmerkezi.net/server.php?command=getModelList Eğer sadece denemek istiyorum diyorsanız, kendi bilgisayarınızda bir wampserver kurup, buraya server.php dosyasını atarsanız. Şu şekilde erişebilirsiniz http://localhost/server.php
Merhaba öncelikle teşekkürler anlatım için.
WampServer da çalışıyorum , server.php dosyasını server ıma attım ancak browser da açmaya çalıştığım zaman;
“Undefined index: command in C:\wamp\www\clientServer\server.php on line 3”
gibi bir hata alıyorum ve marka listesini alamaıyorum, Emulator dede aynı şekilde proje çalışıyo ancak ListView a veriler gelmiyor, nedeni hakkında bir fikriniz var mı? Teşekkürler, İyi Çalışmalar.
Arkadaşlar böle text leri alabiliyoruzda resimleri de alabilir miyiz?
Tabiki alabilirsiniz, ancak yöntemi değiştirmeniz gerekmektedir. Sonuçta burada bilgiler url üzerinden string şeklinde gitmektedir.
Hocam merhaba ben kayit sayfası yapmaya çalışıyorum fakat php sunucuma dizi şeklinde nasıl göndereceğimi yada php tarafından bunu nasıl alacağımı yapamadım yardımcı olabilirmisiniz?TEŞEKKÜRLER
Farklı farklı bilgileri ayrı değişkenlerde göndermelisiniz, eğer bir değişken dizi içeriyorsa, dizi elemanlarını belirli bir ayıracla birleştirip tek string olarak gönderebilirsiniz, server tarafında tekrar ayırma işlemi yaparsınız.
S.a size bi sorum olacak javada değilde php de yapilmis programi yani bn php uye kaydı felan yapsam ve bu uygulamayı android e nasil ceviricem proje tamamen php olacak ama android telefonlara nasil cevirebilirim
Web sitesi için hazırladığınız php ile android uygulaması için hazırladığınız php ler farklı olacak, birisi web sitesi üzerinden kullanıcıya hitap eden bir sayfa olurken, diğeri android uygulaması ile iletişime geçen bir katman olacak. Bu yüzden client için ayrı php ler yazmanız gerekmektedir.
Bunda buton var diyelim veri tabanına da kayıt ekleyecez. Nasıl yapabiliriz?
Nasıl client dan php dosyasına seçilen modeli yollayabiliyorsak, aynı yöntemi veri yollamak için kullanabilirsiniz, daha sonra php ile aldığınız veriyi db ye yazabilirsiniz.
iyi günler hocam bir sorum olacaktı şimdi bi web sitemiz var buna uygun olacak sekilde bir uygulama geliştiriyoruz androidde. bunlar için ortak bir sunucu nasıl kullancagız yardımcı olursanız sevinirim
Basit bir uygulama yapıyorsanız, web sitenizi sunucu gibi de kullanabilirsiniz. Örnekte anlatılan şekilde, client ile iletişime geçecek php sayfaları hazırlayabilirsiniz, böylece websitenizin veritabanını kullanarak uygulamayı da çalıştırabilirsiniz.
Merhabalar birşey sormak isteiyorum. bu vt deki verileri telefonda gösteriyor. peki bunun tam tersini yapabilirmiyiz? telefondaki bilgileri bir php de listeleyebilirmiyiz? örneğin çağrı kayıtlarını nasıl bir php üzerinde çıkarabiliriz?
Yapabilirsiniz, en kolay yolu, telefondan server üzerinde bilgileri gönderim db ye yazmak. Ardında php ile istediğiniz gibi gösterebilirsiniz.
Merhabalar öncelikle bu parse işleminde en temiz anlatım bu olmuş sanırım teşekküler. Ben uyglamayı çalıştırdığımda listview de hiç bir şey görüntülenmiyor acaba nedendir ?
Merhaba hocam ben ToDoList programının daha basit halini yapacam. Bunu Netbeans ya da Eclipse de yapmam gerekiyor. Bunu Birçok kişi kullanabilir olması lazım. Şöyle anlatayım: Karşılıklı olacak. Ortak bir havuzda olur. Comment mantığı vardır, ya da thread de denir, yani eklenen maddeler vardır; ekleyeni, saati ve sırası bellidir, diğer kişi buna alt kırılım olarak cevap verir, bir diğeri de bu kırılımın da altında bir kırılım olarak cevap verir. Bir noktada karşılıklı olarak madde kapanır. Böyle bir proje yapmam lazım bunu nasıl yapabilirim yardımcı olursanız çok memnun olurum.
Yorum Bırakın!
En Son Yazılanlar
Codeigniter Dersleri
Kategoriler
Teknoloji Haberleri
Android Dersleri
Arşiv
İstatistikler
Sitemizin QR Kodu
Yeniliklerden İlk Sizin Haberiniz Olsun
KodMerkezi.Net Facebookta
En Çok Okunanlar
En Son Aranan Kelimeler
En Çok Oy Alanlar
Etiket Bulutu
İlginizi Çekecek Siteler
Arşiv
Yönetim
En Son Yapılan Yorumlar
En Çok Okunanlar