자바 소켓 연결 풀
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 연결 탱크 와 마찬가지 로 서버 의 성능 을 향상 시 켰 습 니 다. ,서버 에서 연결 요청 을 할 때마다 정량 자원 을 유지 합 니 다.
서로 다른 반복 으로 생 성 되 고 자원 이 비어 있 으 면 자원 을 자주 구축 하 는 시간 을 절약 할 수 있 습 니 다.이 두 가지 연결 탱크 는 다 중 스 레 드 환경 에 광범 위 하 게 존재 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.