Anasayfa » Android, Genel, Php

Android ve Php ile Basit Client-Server Uygulaması

9 Mayıs 2012 18.269 kez okundu 27 yorum
1 Star2 Stars3 Stars4 Stars5 Stars (4 oy,5 üzerinden : 5,00 )
Loading...

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

<<< Önceki:

Sonraki: >>>


Facebookta Paylaş

27 yorum »

  • esma dedi ki:

    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?

  • admin dedi ki:

    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.

  • esma dedi ki:

    peki tekrar deneyeceğim, çok teşekkürler..

  • esma dedi ki:

    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 :/

  • admin dedi ki:

    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.

  • selim karataş dedi ki:

    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…

  • admin dedi ki:

    Merhaba Selim,

    Resimden sorunu anlayamadım. Herhangi bir hata ikonu da yok. Nerede sorun yaşıyorsun.

  • Ceren dedi ki:

    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?

  • admin dedi ki:

    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.

  • emre dedi ki:

    Sanırım android üzerine en faydalı bilgiler bu sitede yer alıyor.

  • Ferhat dedi ki:

    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.

  • admin dedi ki:

    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

  • Fatih dedi ki:

    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.

  • levent dedi ki:

    Arkadaşlar böle text leri alabiliyoruzda resimleri de alabilir miyiz?

  • admin dedi ki:

    Tabiki alabilirsiniz, ancak yöntemi değiştirmeniz gerekmektedir. Sonuçta burada bilgiler url üzerinden string şeklinde gitmektedir.

  • ali dedi ki:

    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

  • admin dedi ki:

    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.

  • erkut dedi ki:

    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

  • admin dedi ki:

    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.

  • murat dedi ki:

    Bunda buton var diyelim veri tabanına da kayıt ekleyecez. Nasıl yapabiliriz?

  • admin dedi ki:

    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.

  • muhammed dedi ki:

    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

  • admin dedi ki:

    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.

  • Yahya dedi ki:

    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?

  • admin dedi ki:

    Yapabilirsiniz, en kolay yolu, telefondan server üzerinde bilgileri gönderim db ye yazmak. Ardında php ile istediğiniz gibi gösterebilirsiniz.

  • Mustafa dedi ki:

    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 ?

  • esma dedi ki:

    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!

Yorum yaz, yada kendi sitende trackback (Geri besleme) olarak ekle. Ayrıca RSS ile bu konuya üye olabilirsin. .

Nazik olun. Temiz tutun. Konu dışına çıkmayın. Spam yaratmayın.

Bu tagları kullanabilirsiniz:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Bloğumuz gavatarı desteklemektedir. Kendi gavatarınızı edinmek için lütfen Gravatar a üye olun.