서버에 많은 소켓 연결을 열고 인증하고 연결을 닫은 다음 반복하여 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
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++ }
관련 자료
- get - python - requestsexceptionsconnectionerror :일반적으로 각 소켓 주소 (프로토콜/네트워크 주소/포트)를 한 번만 사용할 수 있습니다
- nginx - Tomcat 9는 항상 http/https 커넥터에 이미 사용중인 주소를 제공합니다
- linux - 노드 익스포터 바인드 주소가 이미 실행 중입니다
- c# - 소켓에 연결하려고 할 때 UI가 지연됩니까?
- .net - 이미 제거한 참조를로드하려는 Sitefinity 12 프로젝트
- c++ - fd_set 내에서 소켓의 IP 주소를 가져 오는 방법은 무엇입니까?
- go - Golang에서 IP 주소 형식 소켓 io를 얻는 방법
- cl-async를 사용하여 Lisp에서 소켓 피어의 주소를 검색하는 방법
- 파이썬이 소켓을 사용하여 외부/공용 IP 주소를 바인딩 할 수 없으며 오류가 발생하지만 로컬 IP 주소를 사용할 때 오류가 표시되지 않습니다
- java - 소켓이 1KB (425B)의 데이터 만 보내는 이유는 무엇입니까?
- python - 다른 호스트로 보낸 후 scapy 스니핑 된 udp 패킷을 수신 할 수 없습니다
- c - I/O 멀티플렉싱 사용시 비 블로킹 소켓
- java - 포트를 인수로 사용하여 소켓 서버 클래스 시작
- Java는 소켓 Python 서버에서 메시지를 수신합니다
- networking - 내 PrintWriter가이 오류를 제공하는 내 메시지를 출력 할 수 없습니다 "thisoutput"이 null이기 때문에 "javaioPrintWriterprintln (Stri
- java - 소켓 데이터 그램 보내기 및 받기
2 분의 TIME_WAIT 기간 내에 많은 아웃 바운드 소켓을 열어 아웃 바운드 포트 공간을 소진합니다. 가장 먼저해야 할 질문은 이것이 실제적인로드 테스트를 나타내는 것입니까? 실제 고객이 실제로 그렇게 할 것입니까? 그렇지 않은 경우 테스트 방법을 수정하면됩니다.
BTW SO_LINGER는응용 프로그램이 close () 동안 데이터가 플러시 될 때까지 대기하는 시간 (초)입니다. 일반적으로 0입니다. 포트가 종료를 종료 한 경우 TIME_WAIT 간격 동안 포트가 정지됩니다. 이것은 같은 것이 아닙니다. SO_LINGER 옵션을 남용하여 문제를 패치 할 수 있습니다. 그러나 이것은 피어에서 예외적 인 동작을 유발하며 다시 테스트의 목적이 아닙니다.