Merhabalar, projemde socket üzerinden string aktarımı gerçekleştirip, gelen veriye göre yeni veriler üretip döndermem gerekmektedir, fakat ilk veride okuma işlemi bir türlü sonlanmamaktadır. Bu sorunu nasıl halledebilirim. Cevaplarınız için şimdiden teşekkürler.

Stringi gonderen kısım:

yaz=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
yaz.write("Gonderilen yazı");
yaz.newLine();

` Okuma yapan kısım:

oku = new BufferedReader(new InputStreamReader(
            socket.getInputStream()));
String veri = oku.readLine();//bu kısımda takılıyor okuma işlemi hiç durmuyor

soruldu: 28 Nis '13, 04:54

idmrbs's gravatar image

idmrbs
1112
cevap kabul oranı: 0%

değiştirildi: 28 Nis '13, 07:46

MDemir's gravatar image

MDemir
2.1k173445

1

yaz.newLine();

satırından sonra

yaz.flush();

eklersen sanırım sorunun çözülür

(29 Nis '13, 02:09) myururdurmaz myururdurmaz's gravatar image

bu yorum bu problemi çözer neden es geçildi ?

(03 May '13, 04:19) BoraDemir BoraDemir's gravatar image

@BoraDemir cevap vermeyi unutmuşum, denedim ama sorun çözülmemişti.

(03 May '13, 09:37) idmrbs idmrbs's gravatar image

Bu şekilde yapmalısınız. Verinin olup olmadığını kontrol etmeniz gerekiyor.

String veri = oku.readLine();

while (veri != null) {
    System.out.println(veri);
    veri = oku.readLine();
}
permanent link

cevaplandı: 28 Nis '13, 06:23

MDemir's gravatar image

MDemir
2.1k173445
cevap kabul oranı: 24%

Hocam dediğiniz gibi yaptım ama farkeden bişey olmadı, String veri = oku.readLine(); bu satırda program bekliyor okuma işlemini bitirmiyor

(28 Nis '13, 07:18) idmrbs idmrbs's gravatar image

işlem bittikten sonra

oku.close();

socket.close();

yapıyor musun?

(28 Nis '13, 07:30) MDemir MDemir's gravatar image

Hocam kusura bakmayın biraz netten uzak kaldım cevap yazamadım. Devamlı veri akışı olacağından dolayı close() metodunu çağıramıyorum, çağırdığım zamanlarda okuma işlem yapılabilmekte.

(30 Nis '13, 13:02) idmrbs idmrbs's gravatar image

readLine metodu \\r karakterini bekliyor. Soketten \\r gelmezse beklemeye devam eder. Bunu çözmek için ya setSoTimeout ile bir süre belirleyip okuma gerçekleşmediğinde readLine metoduna hata attırıp yakalarsınız, (bu hata soketi kapatmaz) ya da daha düzgün ikinci seçenek olarak paketinizin içeriğinin uzunluğunu önceden tamsayı olarak yollayıp sadece paket büyüklüğü kadar kısmı öteki taraftan read metodu ile okutursunuz.

Yani gönderirken:

  1. Tamsayı olarak gönderilecek paketin boyutunu sokete yaz. (özet bilgi)
  2. Paketin kalanını gönder. (asıl bilgi)

Alırken de:

  1. Önce soketten bir tam sayı oku (özet bilgi)
  2. Özet bilgideki boyut kadar bilgiyi soketten oku

Tamsayı göndermede ve almada DataOutputStream::writeInt ve DataInputStream::readInt kullanabilirsiniz.

permanent link

cevaplandı: 29 Nis '13, 04:42

nurettin's gravatar image

nurettin
2.2k2441
cevap kabul oranı: 14%

değiştirildi: 29 Nis '13, 04:44

Hocam veriğiniz bilgileri denemeye çalıştım ama bu seferde dis.readInt(); satırında(dis dataInputStream nesnesi) bekliyor.

(30 Nis '13, 13:16) idmrbs idmrbs's gravatar image

@idmrbs Dediğim gibi karşıdan önce int yollamanız lazım ki orada beklemeden hemen okusun. Ben yaptım çalıştı.

(01 May '13, 08:53) nurettin nurettin's gravatar image

Hocam bende daha öncesinde benzer bi yapı kullanmıştım çalışıyordu ama burada çalışmadı, herhalde başka bir yerde sorun var, cevaplarınız için teşekkürler.

(01 May '13, 15:29) idmrbs idmrbs's gravatar image
Cevabınız
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:

×1,077
×10

Soruldu: 28 Nis '13, 04:54

Görüntüleme: 1,366 kez

Son güncelleme: 03 May '13, 09:37

powered by BitNami OSQA