Yazmış olduğum kodlar gayet düzgün çalışıyor ancak paket boyutu 4096 dan yüksek boyutta bir paket geldiği zaman 4096 bytesini okuyor stringe çeviriyor ve çalıştırıyor kodları daha sonra tekrar dinlemeye geçiyor geri kalan kısmıda tekrar ayrı işliyor. Bunu tek seferde okutup çevirtmeyi beceremedim istediğim şey tüm parçaları sırayla yine parça parça okuyacak birleştiricek sonra işleticek.

Kod :

public void SocketOlusturBaglan()
{
    try {
        Log.e("socket olusuyor ", host + " - " + port);
        SocketAddress sockaddr = new InetSocketAddress(host, port); 
        socket = new Socket();
        socket.connect(sockaddr, 5000);

        out = socket.getOutputStream();
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        char[] buffer = new char[4096];
        int read = in.read(buffer, 0, 4096); 
        while(read != -1){
            String veri = new String(buffer).replace("\\0", "");
            byte[] bts = veri.getBytes();
            int pkt_int = bts[0];

            Intent intveri = new Intent("wrc_network");
            intveri.putExtra("islem", pkt_int);
            intveri.putExtra("yon", "geldi"); // veri geldi
            intveri.putExtra("veri", veri);
            cnt.sendBroadcast(intveri);

            read = in.read(buffer, 0, 4096); 
            if (socket.isClosed()) // bağlantı koptuysa
            {
                Log.i("th baglanti koptu", "closed");
                break;
            }
        }
        try {
            in.close();
            out.close();
            socket.close();
            socket = null;
        } catch (IOException e) {}

        try {
            socket = null; 
            Log.i("s", "null1");
        } catch (Exception e) {}

    } catch (Exception e) {
        socket=null;
        Log.i("s", "hata1: null2 " + e.getMessage() + " - " + e.getLocalizedMessage());
        e.printStackTrace();
    }

    if (socket==null)
    {
        Log.i("tekrar", "tekrar bağlanma başlatılıyor");
        ThreadDurdur(th_tekrar_baglan_kontrolu);
        th_tekrar_baglan_kontrolu = new Thread() // bağlantı koparsa tekrar bağlanmaya çalışıcak
        {
            @Override
            public void run() {
                try {
                    Thread.sleep(5000);
                } catch (Exception e) {

                }
                Log.i("tekrar", "tekrar bağlanmaya çalışılıyor");
                SocketOlusturBaglan();
            }
        };
        th_tekrar_baglan_kontrolu.start();
    }
}

Buda kendi denediğim bir yöntem aslında çalışıyor ama bazen thread.sleep(100); ile diğer paket gelene kadar bekletiyorum ama diğer paket biraz geç gelirse yine ayrı bir paket olarak görüyor bu zamanı ne kadar arttırırsam arttırayım stabil bir şekilde doğru sonuca varamamış olacağım ve performans kaybı olacak. En düzgün şekilde nasıl çözebilirim ?

public int MAX_BUFFER_BYTE = 4096;

public void SocketOlusturBaglan()
{
    try {
        Log.e("socket olusuyor ", host + " - " + port);
        SocketAddress sockaddr = new InetSocketAddress(host, port); 
        socket = new Socket();
        socket.connect(sockaddr, 5000);
        socket.setKeepAlive(true);
        socket.setReceiveBufferSize(MAX_BUFFER_BYTE);
        out = socket.getOutputStream();
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        List<char[]> buffer = new ArrayList<char[]>();
        buffer.clear();
        buffer.add(new char[MAX_BUFFER_BYTE]);
        int toplam = in.read(buffer.get(0));
        int kalan = toplam - MAX_BUFFER_BYTE;
        int okunan = MAX_BUFFER_BYTE;
        int sira = 0;

        while(toplam != -1){
            String veri = new String(buffer.get(0)).replace("\\0", "");
            byte[] bts = veri.getBytes();
            int pkt_int = bts[0];
            while (in.ready()) // daha kaldıysa
            {
                sira++;
                kalan -= MAX_BUFFER_BYTE;
                okunan+=MAX_BUFFER_BYTE;
                buffer.add(new char[MAX_BUFFER_BYTE]);
                thread.sleep(100);
                in.read(buffer.get(sira),0,MAX_BUFFER_BYTE);
            }
            veri = "";
            for (char[] bfr : buffer) {
                veri += new String(bfr).replace("\\0", "");
            }

            Intent intveri = new Intent("wrc_network");
            intveri.putExtra("islem", pkt_int);
            intveri.putExtra("yon", "geldi"); // veri geldi
            intveri.putExtra("veri", veri);
            cnt.sendBroadcast(intveri);

            // SIFIRLA BİLGİLERİ
            sira=0;
            buffer.clear();
            buffer.add(new char[MAX_BUFFER_BYTE]);
            okunan = 0;

            toplam = in.read(buffer.get(0));
            kalan = toplam - MAX_BUFFER_BYTE;
            okunan += MAX_BUFFER_BYTE;
        }
        try {
            in.close();
            out.close();
            socket.close();
            socket = null;
        } catch (IOException e) {}

        try {
            socket = null; 
            Log.i("s", "null1");
        } catch (Exception exx) {}

    } catch (Exception e) {
        socket=null;
        Log.i("s", "hata1: null2 " + e.getMessage() + " - " + e.getLocalizedMessage());
        e.printStackTrace();
    }

    if (socket==null)
    {
        Log.i("tekrar", "tekrar bağlanma başlatılıyor");
        ThreadDurdur(th_tekrar_baglan_kontrolu);
        th_tekrar_baglan_kontrolu = new Thread() // bağlantı koparsa tekrar bağlanmaya çalışıcak
        {
            @Override
            public void run() {
                try {
                    Thread.sleep(5000);
                } catch (Exception e) {

                }
                Log.i("tekrar", "tekrar bağlanmaya çalışılıyor");
                SocketOlusturBaglan();
            }
        };
        th_tekrar_baglan_kontrolu.start();
    }
}

Şunu da belirteyim kodlar servis olarak çalışıyor ve socketin sürekli olarak dinleme halinde kalması lazım. Teşekkürler.

soruldu: 22 May '13, 12:14

WurucU's gravatar image

WurucU
1222
cevap kabul oranı: 0%

değiştirildi: 24 May '13, 04:07

CemIkta's gravatar image

CemIkta ♦
19.9k29125190

Android le pek ikgim yok. Fakat surekli soket dinlemek yerine push notification kullansaniz daha saglikli olmaz mi? Push la gonderilebilen uzunluk size yetmiyorsa unique bir id gonderip gelen id yi kullanarak, bir webservis araciligiyla istediginiz veriyi cekebilirsiniz. Tabi bu projeyi lokal networkte kullanacaksaniz push lokal networkte nasil yapilir onu bilmiyorum.

(22 May '13, 23:08) huseying huseying's gravatar image

Anlık mesajlaşma uygulaması yapıyorum mesajların anında karşı tarafa ulaşması gerekiyor aynı zamanda kişilerin avatarları profil bilgileri vs. kişiye göre session gerekli bu yüzden push notification ile yapılması gereksiz ek uğraş, öneriniz için teşekkürler.

(23 May '13, 10:56) WurucU WurucU's gravatar image
Bu soruya ilk cevap veren sen ol!
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×817
×10

Soruldu: 22 May '13, 12:14

Görüntüleme: 556 kez

Son güncelleme: 24 May '13, 04:07

powered by BitNami OSQA