Assalomu alaykum, yordam.uz saytimizga xush kelibsiz.
Bu saytda o`zingizni qiziqtirgan savollarga javob olishingiz va o`z sohangiz bo`yicha savollarga javob berishingiz mumkin. Bizning Oilamizga a'zo bo`lganingiz uchun chuqur Minnatdorchilik bildiramiz !!!

Javada Socketlar bilan ishalash

+1 ovoz
184 marta ko‘rilgan
so‘radi 14 yanvar, 18 SARVARBEK (355 bal)
tahrirlandi 14 yanvar, 18 Saidolim
1. //Global o'zgaruvchilar
2. Socket socket;
3. BufferedOutputStream out1;
4. PushbackInputStream in1;
5. DataInputStream inData ;
6. 
7. public void main()
8. {
9. //...
10. socket = new Socket(host, port);
11. out1 = new BufferedOutputStream(socket.getOutputStream());
12.  in1= new PushbackInputStream(new BufferedInputStream(socket.getInputStream()), 3);
13. inData = new DataInputStream(in1);
14. //...
15. for(int i=0;i<n;i++)
16. {
17. ReadFromSocket();
18. }
19. //...
20. }
21. 
22. public void ReadFromSocket()
23. {
24. //...
25.  if(socket.isConnected())
26.   {
27.      byte[] bits = new byte[512];            
28.      inData.readFully(bits);
29.      //...
30.   }
31. }

Assalom aleykum. Javada ishlashni endi boshlayotgan edim. Socketlar bilan ishlashda muammoga duch keldim. Yuqorida yozilgan kodda ReadFromSocket() funksiyasiga n marta murojaat qilinadi. Muammo shundaki, dastur ishlashi jarayonida 25-qatordagi shart bajarilganda ham dastur 28-qatorga kelib qotib qolyapdi (menimcha internet tezligi pastligi sabab), ya'ni foydalanuvchi ancha vaqt kutib qolyapdi. Dasturni shunday o'zgartirish kerakki 28-qator bajarilayotganda oradan S (taxminan S=20) sekund vaqt o'tganda ham dasturda 28-qator bajarilayotgan bo'lsa dasturda host bilan aloqa yo'q degan xabar berilishi kerak.

Bu muammoni timer bilan hal qilishga harakat qilib ko'rgandim. Ishladi, lekin dastur sustlashib qoldi. Dasturga nagruzka tushirmaydigan, optimal yechimi bormi, shu muammoni?

Oldindan rahmat!

2 Javoblar

0 ovoz
javob berdi 18 mart, 18 SARVARBEK (355 bal)
 
Eng yaxshi javob

Kodingizni 10-qatorini quyidagicha qilib o'zgartiring:

socket=new Socket();

socket.connect(host,port);

socket.setSoTimeout(10*1000);//Bu holatda 10 sekund kutiladi
+1 ovoz
javob berdi 14 yanvar, 18 Saidolim (3,566 bal)

Sizning kodda

27.      byte[] bits = new byte[512];            
28.      inData.readFully(bits);

shu yerda, nima uchun aynan readFully() ishlatdingiz? Agar read() ishlatsangiz muammoingiz hal bo`lishi kerak

27.      byte[] bits = new byte[512];            
28.      inData.read(bits);

Sababi.. bits ning uzunligi 512. Shu sababli readFully() funksiyasi 512 byte o`qimaguncha potokni ushlab turadi.

read() esa 512 gacha bo`lgan uzunlikda o`qiydi. Kamroq o`qisa ham to`xtab, o`qib bo`lgan qismini sizga beradi.

izoh qoldirdi 14 yanvar, 18 SARVARBEK (355 bal)
readFully() ishlatganimni sababi jo'natilayotgan ma'lumot jo'natuvchi tomonidan ma'lum algoritm bilan zichlab jo'natiladi. Zichlangan ma'lumot 512 baytni tashkil qiladi. 512 baytni bo'laklab o'qib olsam zichlangan ma'lumotni qayta tiklashning iloji bo'lmaydi. Shuning uchun readFully() dan foydalangandim.
izoh qoldirdi 15 yanvar, 18 Saidolim (3,566 bal)
unda kutishingizga yoki alohida potok ochishingizga to`g`ri keladi. chunki 512 yetib kelmagunicha bu funksiya davomiga o`tmaydi. va o`tsa xato bo`ladi. mantiqan ham
izoh qoldirdi 24 yanvar, 18 SARVARBEK (355 bal)
Agar men siz aytgandaka kodimni

27.      byte[] bits = new byte[512];            
28.      inData.read(bits);

qilib o'zgartirsam, keyin nechchi bayt o'qib olganimni qanaqa qilib aniqlasam bo'ladi, bits.Length da doim 512 qaytadiku bu holatda.

Yana bir savol, man inData.read qilib o'qib olgan baytlarim streamdan o'chib ketadimi, aytmoqchimanki inData.read funksiyasiga sikl ichida murojaat qilsam bitta baytni qayta-qayta o'qib olmaymanmi?
izoh qoldirdi 25 yanvar, 18 Saidolim (3,566 bal)
Alohida savol qilmapsizda shuni, mayli.

int len = inData.read(bits);

qilsangiz, len o`zgaruvchida nechta o`qiganingiz bo`ladi. Agar len = -1 bo`lsa, demak socket toza va ma'lumot o`qiy olmagan bo`ladi.

Agar sikl ichida o`qisangiz, u doim davomini o`qiydi. bitta narsani o`qib turmidi.

Assalomu alaykum, yordam.uz saytimizga xush kelibsiz.

Bu saytda o`zingizni qiziqtirgan savollarga javob olishingiz va o`z sohangiz bo`yicha savollarga javob berishingiz mumkin.

Bizning Oilamizga a'zo bo`lganingiz uchun chuqur Minnatdorchilik bildiramiz !!!

Telegram kanal YordamUzRss

...