>

서버에 많은 소켓 연결을 열고 인증하고 연결을 닫은 다음 반복하여 Java 서버를로드 테스트하려고합니다. 내 앱이 잠시 동안 실행되지만 결국에는 다음과 같은 결과가 나타납니다.

와이즈 비즈 내가 읽은 문서에 따르면, 닫힌 소켓이 close ()가 호출 된 후 일정 기간 동안 할당 된 로컬 주소를 여전히 차지하기 때문입니다. 이것은 OS에 따라 다르지만 몇 분 정도 걸릴 수 있습니다. 나는

java.net.BindException: Address already in use: connect

를 호출하려고   setReuseAddress(true) 직후 주소를 재사용 할 수 있기를 희망하는 소켓에  호출되었다. 불행히도 이것은 사실이 아닙니다.

소켓 생성 코드는 다음과 같습니다 :

close()

그러나 여전히이 오류가 발생합니다 :

와이즈 비즈

내가하려는 일을 수행하는 다른 방법이 있습니까? 예를 들어, 100 개의 소켓을 열고 모두 닫고 200 개의 소켓을 열고 모두 닫고 300을 여는 등 최대 2000 개 정도의 소켓이 필요합니다.

어떤 도움이라도 대단히 감사하겠습니다!

Socket socket = new Socket(); socket.setReuseAddress(true); socket.connect(new InetSocketAddress(m_host, m_port));

  • 답변 # 1

    2 분의 TIME_WAIT 기간 내에 많은 아웃 바운드 소켓을 열어 아웃 바운드 포트 공간을 소진합니다. 가장 먼저해야 할 질문은 이것이 실제적인로드 테스트를 나타내는 것입니까? 실제 고객이 실제로 그렇게 할 것입니까? 그렇지 않은 경우 테스트 방법을 수정하면됩니다.

    BTW SO_LINGER는응용 프로그램이 close () 동안 데이터가 플러시 될 때까지 대기하는 시간 (초)입니다. 일반적으로 0입니다. 포트가 종료를 종료 한 경우 TIME_WAIT 간격 동안 포트가 정지됩니다. 이것은 같은 것이 아닙니다. SO_LINGER 옵션을 남용하여 문제를 패치 할 수 있습니다. 그러나 이것은 피어에서 예외적 인 동작을 유발하며 다시 테스트의 목적이 아닙니다.

  • 답변 # 2

    bind ()를 사용하지 않지만 setReuseAddress (true)는 이상합니다. 그 의미를 이해하기를 바랍니다. setReuseAddress (및 시점). 100-2000은 열어야 할 소켓 수가아닙니다. 그러나 연결하려는 서버 (같은 가산기/포트 쌍으로 보이므로)는 정상적인 백 로그에서 드롭 할 수 있습니다. 50 개 중

    편집 : 여러 소켓을 빠르게 열어야하는 경우 (ermm 포트 스캔?) NIO 및 connect ()/finishConnect () + 선택기를 사용하는 것이 좋습니다. 같은 스레드에서 1000 개의 소켓을 여는 것은 속도가 느립니다. 코드에서 finishConnect ()가 필요할 수 있습니다.

  • 답변 # 3

    사용할 포트를 계획해야한다고 생각합니다. 이 말은 주어진 포트를 사용하여시도를 의미합니다. 연결이 실패하거나 예외가 발생하면 다음 포트 번호를 사용하여 연결을 시도하십시오.

    와이즈 비즈를 감싸보세요   connect 의 진술 .

    여기서 내가 작동 할 것으로 생각되는 의사 코드가 있습니다 :

    try/catch
    
    
    이 코드는 "모든 포트가 사용 중일 때 어떤 일이 발생합니까?"

    portNumber = x //where x is the first port number you will try numConnections = 200 // or however many connections you want to open while(numConnections > 0){ try{ connect(host, portNumber) numConnections-- }catch(){} portNumber++ }

  • 이전 c++ - char *를 문자열로 복사하거나 그 반대로 복사하는 방법
  • 다음 spring - 예외 처리기에서 내용 유형을 변경하는 방법