|  | 
  | 
    
      | 
        
          | 
            
              | 
                
                  | 자바네트워크I/O |  
                  | 
                    
                      | [1] |  
                      | 
                        
                          |   | 등록일:2008-03-12 10:36:06           (0%) 작성자:
   제목:NIO를 이용한 Echo 서버
 |  |  
                      | import  java.net.*; import  java.nio.*;
 import  java.nio.channels.*;
 import  java.nio.charset.*;
 import  java.util.*;
 
 
 
 public  class  NioEchoServer
 {
 private  int  port  =  9090;
 private  ServerSocketChannel  serverSocketChannel  =  null;
 private  Selector  selector  =  null;
 private  Charset  charset  =  null;
 
 private  Vector  v  =  null;
 
 >더보기
 
 >접기
 
 
 public  NioEchoServer()
 {
 try
 {
 charset  =  Charset.forName("EUC-KR");
 selector  =  Selector.open();
 serverSocketChannel  =  ServerSocketChannel.open();
 serverSocketChannel.configureBlocking(false);
 serverSocketChannel.socket().bind(new  InetSocketAddress(port));
 serverSocketChannel.register(selector,  SelectionKey.OP_ACCEPT);
 
 v  =  new  Vector();
 }
 catch(Exception  e)
 {
 try
 {
 if(serverSocketChannel  !=  null)
 {
 serverSocketChannel.close();
 serverSocketChannel  =  null;
 }
 if(selector  !=  null)
 {
 selector.close();
 selector  =  null;
 }
 }
 catch(Exception  ex)
 {
 
 }
 e.printStackTrace();
 }
 }
 
 public  void  start()
 {
 while(true)
 {
 try
 {
 selector.select();
 
 Iterator  iter  =  selector.selectedKeys().iterator();
 while(iter.hasNext())
 {
 SelectionKey  key  =  (SelectionKey)iter.next();
 
 if(key.isAcceptable())
 {
 //  accept  처리
 clientAccept(key);
 }
 else  if(key.isReadable())
 {
 //  read  처리
 readMessage(key);
 }
 
 iter.remove();
 }
 }
 catch(Exception  e)
 {
 e.printStackTrace();
 }
 }
 }
 
 private  void  clientAccept(SelectionKey  key)
 {
 SocketChannel  sc  =  null;
 ServerSocketChannel  ssc  =  null;
 
 try
 {
 ssc  =  (ServerSocketChannel)key.channel();
 sc  =  ssc.accept();
 sc.configureBlocking(false);
 sc.register(selector,  SelectionKey.OP_READ);
 
 v.add(sc);
 
 System.out.println(sc.toString()  +  "  클라이언트가  접속을  했습니다.");
 }
 catch(Exception  e)
 {
 if(sc  !=  null)
 {
 try
 {
 sc.close();
 sc  =  null;
 }
 catch(Exception  ex)
 {
 
 }
 }
 e.printStackTrace();
 }
 }
 
 private  void  readMessage(SelectionKey  key)
 {
 ByteBuffer  buffer  =  null;
 SocketChannel  sc  =  null;
 
 try
 {
 buffer  =  ByteBuffer.allocateDirect(1024);
 sc  =  (SocketChannel)key.channel();
 
 sc.read(buffer);
 
 //  모든  클라이언트에게  메시지  전송
 allClientSendMessage(buffer);
 System.out.println(charset.decode(buffer).toString());
 
 buffer.clear();
 buffer  =  null;
 }
 catch(Exception  e)
 {
 try
 {
 v.remove(sc);
 System.out.println(sc.toString()  +  "  클라이언트가  접속을  종료했습니다.");
 
 sc.close();
 sc  =  null;
 }
 catch(Exception  ex)
 {
 
 }
 }
 }
 
 private  void  allClientSendMessage(ByteBuffer  buffer)
 {
 try
 {
 buffer.flip();
 
 Iterator  iter  =  v.iterator();
 
 while(iter.hasNext())
 {
 SocketChannel  sc  =  (SocketChannel)iter.next();
 sc.write(buffer);
 buffer.rewind();
 }
 }
 catch(Exception  e)
 {
 e.printStackTrace();
 }
 }
 
 public  static  void  main(String[]  args)
 {
 new  NioEchoServer().start();
 }
 }
 |  
                      | [본문링크] NIO를 이용한 Echo 서버 |  
                      | [1] |  
                      |  |  |  |  |  
  | 
    
      | 코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=2526   |  |  
  |  |  
  |  |  
  |  |  
          |  |  
          |  |  |  |  | 
|  
	
		| 
	
	| Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.   |  |  |