자바 소켓 연결 풀

소켓 연결 풀 
             
      SocketServerPool 두 개의 인자 listenPort 를 포함 합 니 다. maxConnection 。각각 감청 포트 와 최대 연결 수 를 나타 낸다.
      함수 setHandlers()에서 PoolConnection Handler 의 스 레 드 5 개 를 초기 화 했 습 니 다.풀 에서 최대 5 개의 연결 을 동시에 처리 할 수 있 음 을 표시 합 니 다.
import java.io.*;
import java.net.*;


public class SocketServerPool {

    /**//*         */
    private int maxConnections ;
    private int listenPort     ;
    
    public SocketServerPool(int listenPort , int maxConnections){
        this.listenPort = listenPort ;
        this.maxConnections = maxConnections ;
        
    }    
    public void  acceptConnections(){        
        try {
            ServerSocket serverSocket = new ServerSocket(listenPort , 5) ;
            Socket socket= null ;
            while(true)
            {
                socket = serverSocket.accept() ;
                PoolConnectionHandler.processRequest(socket) ;
            }    
        } catch (IOException e) {
            e.printStackTrace();
        }        
        
    }
    
    public void setHandlers()
    {
       for(int i = 0 ; i < this.maxConnections ; i++ )
       {
           PoolConnectionHandler poolHandler = new PoolConnectionHandler() ;
           new Thread(poolHandler , "handler" + i).start() ;
       }    
    }
    
    
    public static void main(String [] args)
    {
        SocketServerPool pool = new SocketServerPool(8888 , 5) ;
        pool.setHandlers() ;
        pool.acceptConnections() ;    
    }
    
   
}

  2 선 탱크 의 조수 류 PoolConnection Handler
        run 방법 에서 현재 풀 풀 이 비어 있 으 면 wait()함수 에서 막 습 니 다.새로운 클 라 이언 트 가 연결 되면 pool 은 notify All()방법 을 호출 합 니 다.
         pool 이 활성화 되 고 handle Connection 방법 을 호출 합 니 다.
      
 오류:
                run()방법 중의 while(true)순환 은 지 울 수 없습니다.
               max Connection 개 를 초기 화 했 기 때 문 입 니 다. PoolConnection Handler 를 계속 실행 해 야 합 니 다.그렇지 않 으 면 순환 을 삭제 하고 요청 을 한 번 처리 하면
              max Connection 개 이외 의 연결 요청 에 응답 할 수 없습니다.
import java.io.*;
import java.net.*;
import java.util.LinkedList;
import java.util.List;

/**
 *       ,       
 */
public class PoolConnectionHandler implements Runnable{

    protected Socket connection;
    protected static List<Socket> pool = new LinkedList<Socket>();

    /** *//**
     * @param requestToHandler  
     *                socket
     *           
     */
    public static void processRequest(Socket requestToHandler) {
        synchronized (pool) {
            pool.add(pool.size(), requestToHandler);
            pool.notifyAll();
        }

    }
    
    public void handleConnection()
    {    
        System.out.println(Thread.currentThread().getName() + "handler" + connection) ;
        PrintWriter writer = null;   
        try {
            writer = new PrintWriter(connection.getOutputStream()) ;
            writer.write(Thread.currentThread().getName() + "handle me" + connection.getPort());
            writer.flush() ;                
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            writer.close() ;
        }    
    }
    
    
    public void run()
    {
        
        /**//*
         *   while true      
         *            ,         
         * 
         */
        while(true)
        {
            synchronized(pool){
                while(pool.isEmpty()){
                    try {
                        pool.wait() ;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                        return ;
                    }            
                }
                connection = pool.remove(0) ;        
            }
            
            handleConnection() ;    
            
        }
    }
    
}

  3 클 라 이언 트 테스트 클래스 
        SocketClient 류 는 Runnable 을 물 려 받 았 습 니 다. 인 터 페 이 스 는 run 방법 에서 100 번 의 링크 가 생 겼 지만 매번 최대 5 개의 링크 를 연결 합 니 다.
import java.net.*; 
import java.io.*;

public class SocketClient implements Runnable{

     public void run()
     {
         try {
            Socket socket = new Socket("192.168.1.101" , 8888) ;
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println(br.readLine()) ;
            br.close() ;
            socket.close() ;            
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
         
     }
    
     public static void main(String [] args)
     {
         for(int i = 0 ; i < 100 ; i++ )
         {
             new Thread(new SocketClient()).start() ;
             
         } 
     }
     
}

 넷.  총결산 
      socket 연결 탱크 는 데이터베이스 jdbc 연결 탱크 와 마찬가지 로 서버 의 성능 을 향상 시 켰 습 니 다. ,서버 에서 연결 요청 을 할 때마다 정량 자원 을 유지 합 니 다. 
      서로 다른 반복 으로 생 성 되 고 자원 이 비어 있 으 면 자원 을 자주 구축 하 는 시간 을 절약 할 수 있 습 니 다.이 두 가지 연결 탱크 는 다 중 스 레 드 환경 에 광범 위 하 게 존재 합 니 다.

좋은 웹페이지 즐겨찾기