powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Объясните, плз, рaботу NIO
4 сообщений из 4, страница 1 из 1
Объясните, плз, рaботу NIO
    #33232790
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
Вот код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
 import  java.io.BufferedReader;
 import  java.io.InputStreamReader;
 import  java.io.PrintWriter;
 import  java.io.IOException;
 import  java.nio.channels.Selector;
 import  java.nio.channels.ServerSocketChannel;
 import  java.nio.channels.SelectionKey;
 import  java.nio.channels.spi.SelectorProvider;
 import  java.net.InetAddress;
 import  java.net.InetSocketAddress;
 import  java.net.Socket;
 import  java.util.Set;
 import  java.util.Iterator;
 import  java.util.Date;


 public   class  testclass {


     private   static  BufferedReader reader =  new  BufferedReader( new  InputStreamReader(System.in));


     static   String readLine()  throws  Exception{
         return  reader.readLine();
    }

     private   static   int  i;

     public   static   int  testf()  throws  Exception {
         for  ( int  i= 1 ; i< 10 ; i++)
        {
            System.out.println("hello");
            readLine();
        }
         return   0 ;
    }

     public   static   void  main(String args[]) {
        ServerSocketChannel ssc =  null ;
         try  {
            Selector selector = SelectorProvider.provider().openSelector();
            ssc = ServerSocketChannel.open();
            InetAddress ia = InetAddress.getLocalHost();
            InetSocketAddress isa =  new  InetSocketAddress(ia,  65000 );
            ssc.configureBlocking(false);
            ssc.socket().bind(isa);
            ssc.register(selector, SelectionKey.OP_ACCEPT);
            System.out.println("Servering naX...");

             while (true){
                selector.select();
                Set sk = selector.selectedKeys();
                Iterator i = sk.iterator();
                 while (i.hasNext()){
                    SelectionKey csk = (SelectionKey)i.next();
                     ServerSocketChannel cssc = (ServerSocketChannel)csk.channel();
                    Socket cs = ssc.socket().accept();
                    PrintWriter pw =  new  PrintWriter(cs.getOutputStream());
                    pw.println( new  Date());
                    pw.close();
                    cs.close();
                    cssc.close(); // вот эта строка была выделена жирным шрифтом :)
                    i.remove();

                }
            }

        }  catch  (Exception e) {
            e.printStackTrace();
        }
         try {
        ssc.close();
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}

Если оставить строку, выделенную жирным шрифтом, то сервер отрубаеться после обработки запроса первого клиента, однако, оставляет сокет открытым.
Если ее убрать - то работает "вечно". ПОЧЕМУ?????

зы: сильно не бейте.... :)
...
Рейтинг: 0 / 0
Объясните, плз, рaботу NIO
    #33233403
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
Все. разобрался.
...
Рейтинг: 0 / 0
Объясните, плз, рaботу NIO
    #33234496
AciD_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, так раскажи же ж, в чем дело!!!
...
Рейтинг: 0 / 0
Объясните, плз, рaботу NIO
    #33236285
foo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
foo
Гость
Все очень просто:
Читаем в JavaDoc по SelectionKey:


Код: plaintext
1.
2.
3.
4.
5.
6.
/**
     * Returns the channel for which this key was created.  This method will
     * continue to return the channel even after the key is cancelled.  </p>
     *
     * @return  This key's channel
     */
     public   abstract  SelectableChannel channel();


а теперь смотрим на реализацию:



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
 package  sun.nio.ch;

 import  java.nio.channels.*;
 import  java.nio.channels.spi.AbstractSelectionKey;

// Referenced classes of package sun.nio.ch:
//            SelChImpl, SelectorImpl

 class  SelectionKeyImpl  extends  AbstractSelectionKey
{

     int  getIndex()
    {
         return  index;
    }

     public   int  interestOps()
    {
        ensureValid();
         return  interestOps;
    }

     int  nioInterestOps()
    {
         return  interestOps;
    }

     int  nioReadyOps()
    {
         return  readyOps;
    }

     public   int  readyOps()
    {
        ensureValid();
         return  readyOps;
    }

     private   void  ensureValid()
    {
         if (!isValid())
             throw   new  CancelledKeyException();
         else 
             return ;
    }

     void  nioReadyOps( int  i)
    {
        readyOps = i;
    }

     void  setIndex( int  i)
    {
        index = i;
    }

     public  SelectableChannel channel()
    {
         return  (SelectableChannel)channel;
    }

     public  SelectionKey interestOps( int  i)
    {
        ensureValid();
         return  nioInterestOps(i);
    }

    SelectionKey nioInterestOps( int  i)
    {
         if ((i & ~channel().validOps()) !=  0 )
        {
             throw   new  IllegalArgumentException();
        }  else 
        {
            channel.translateAndSetInterestOps(i,  this );
            interestOps = i;
             return   this ;
        }
    }

     public  Selector selector()
    {
         return  selector;
    }

    SelectionKeyImpl(SelChImpl selchimpl, SelectorImpl selectorimpl)
    {
        channel = selchimpl;
        selector = selectorimpl;
    }

     final  SelChImpl channel;
     final  SelectorImpl selector;
     private   int  index;
     private   volatile   int  interestOps;
     private   int  readyOps;
}

и видим, что в строчке, которая была выделена жирным шрифтом, закрывался серверный сокет.

Мораль: спать больше надо...
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Объясните, плз, рaботу NIO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]