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 Socket bilan ishlaganda oqimni band qilish vaqtini boshqarish

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

Assalom aleykum. Yuqorida yozilgan kod bajarilishida 26-qatorda socket streamdan 512 baytni o'qib olmaguncha potokni o'zida ushlab turadi,potokni o'zida ushlab turish vaqti maksimumi 9-qatorda yozilgan 'socket.setSoTimeout(10000);' bilan o'lchanadimi? Ya'ni, agar berilgan host va port bilan aloqa bor bo'lsayam, 26-qatordagi potokni o'zida ushlab turish vaqti maksimum 10000 millisekund bo'ladimi?

Oldindan rahmat

1 ta javob

0 ovoz
javob berdi 26 yanvar, 18 Saidolim (3,566 bal)
tahrirlandi 26 yanvar, 18 Saidolim

Socket Timeout boshqa narsaga ishlidi. Sizning holatda 10 sekundan ko`p vaqt ketishi mumkin.

Socket Timeout ishlashi uchun sizning potok 10 sekunda davomida -1 qiymat berib turgan bo`lishi kerak.

Tavsiya qilaman, 

inData.read(bits);

dan foydalanishni

izoh qoldirdi 26 yanvar, 18 SARVARBEK (355 bal)
if(socket.isConnected())
{
                List<byte> listbytes = new List<byte>();
                int summa = 0;
                DateTime currenttime = DateTime.Now;
                while (summa <= 512)
                {

                    int uqildi = 0;
                    byte[] bits = new byte[512 - summa];
                    uqildi = inData.read(bits);
                    if (uqildi > 0)
                    {
                        for (int i = 0; i < uqildi; i++)
                        {
                            listbytes.Add(bits[i]);
                        }
                        summa += uqildi;
                        TimeSpan time = DateTime.Now - currenttime;
                        if (time.TotalSeconds > 10)
                        {
                            //Kutish vaqt 10 sekunddan oshib ketdi
                            return null;
                        }
                    }
                }
               //512 bayt o'qildi
               return listbytes;
}


Kodimni shunaqa qilib o'zgartirgandim. Lekin bu holatda ko'pincha (90-95 % holatda) uqildi=0 bo'lyapdi (mani streamdan o'qib olish tezligim streamga yozilish tezligidan yuqoriroq, menimcha shuning uchun uqildi=0 bo'lib qolyapdi).


Manga 512 bayt o'qib olguncha kutishi, agar kutish vaqti 10 sekunddan oshib ketsa aloqa yo'q degan xabar berilishi kerak. Shu joyi hech o'xshamayapdi
izoh qoldirdi 29 yanvar, 18 Saidolim (3,566 bal)
> Manga 512 bayt o'qib olguncha kutishi, agar kutish vaqti 10 sekunddan oshib ketsa aloqa yo'q degan xabar berilishi kerak. Shu joyi hech o'xshamayapdi

Buning uchun timer qo`yasiz. va time orqali tekshirasiz. ahar hali yopilmagan bo`lsa, socket, uni yopib, xatolikni chiqarasiz.
izoh qoldirdi 29 yanvar, 18 SARVARBEK (355 bal)
Hozi shunaqa qilib ishlatyotgandim, lekin bu optimal yechimga o'xshamayapdi, agar bir vaqtni o'zida bir nechta socketlar bilan aloqa uzilib qolsa, shu joyiga keganda programma sustlashib qolyapdi.

Rahmat

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

...