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

Код: 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
25.08.2005, 10:48
    #33233403
foo
foo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните, плз, рaботу NIO
Все. разобрался.
...
Рейтинг: 0 / 0
25.08.2005, 16:07
    #33234496
AciD_v
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните, плз, рaботу NIO
Ну, так раскажи же ж, в чем дело!!!
...
Рейтинг: 0 / 0
26.08.2005, 14:33
    #33236285
foo
foo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Объясните, плз, рaботу NIO
Все очень просто:
Читаем в 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
Форумы / Java [игнор отключен] [закрыт для гостей] / Объясните, плз, рaботу NIO / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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