JAVA -- ServerSocket 닫 기
accept () 방법 은 무한 순환 내 차단 으로 while 순환 을 종료 할 수 없습니다.
API
public Socket accept() throws IOException
수사 청 은 이 소켓 에 연결 하여 받 아들 여야 한다.이 방법 은 연결 이 될 때 까지 막 힐 것 이다.
새 Socket
s
을 만 들 고 안전 관리자 가 있 으 면 s.getInetAddress().getHostAddress()
과 s.getPort()
를 매개 변수 로 안전 관리자 checkAccept
방법 을 사용 하여 작업 을 허용 하도록 합 니 다.이 는 Security Exception 으로 이 어 질 수 있다.결실
새 소켓
이상 하 다
IOException
- 연결 을 기다 리 는 중 I / O 오류 가 발생 하면.SecurityException
- 안전 관리자 가 존재 하고 그 checkAccept
방법 은 조작 을 허용 하지 않 습 니 다.SocketTimeoutException
- 이전에 setSoTimeout 을 사용 하여 시간 을 초과 하고 시간 을 초과 하면.IllegalBlockingModeException
- 이 소켓 이 연 결 된 채널 이 있다 면 이 채널 은 비 차단 모드 에 있 고 받 아들 일 연결 이 준비 되 어 있 지 않 습 니 다.별도로 참조 하 시기 바 랍 니 다:
SecurityManager.checkAccept(java.lang.String, int)
public void setSoTimeout(int timeout) throws SocketException
지정 한 시간 초과 가 있 는 밀리초 단위 로 사용 / 사용 하지 않 기
SO_TIMEOUT
.이 옵션 을 사용 하면 0 초 과 를 설정 합 니 다. 이 ServerSocket 의 accept () 호출 은 이 시간 만 막 습 니 다.시간 이 초과 되면 자바. net. SocketTimeoutException 이 발생 합 니 다. 비록 ServerSocket 은 여전히 유효 하지만.이 옵션 을 사용 해 야 차단 작업 에 들 어 갈 수 있 습 니 다.시간 초과 시간 은 반드시 > 0
이 어야 한다.시간 초과 가 0 으로 무한 시간 초과 로 해석 된다.매개 변수
timeout
- 지 정 된 시간 초과, 밀리초 단위이상 하 다
SocketException
- TCP 오류 와 같은 바 텀 프로 토 콜 이 잘못 되면.다음 버 전부터:
JDK1.1
별도로 참조 하 시기 바 랍 니 다:
getSoTimeout()
해결 방안
Timeout 사용 하기 (int) 타임 아웃) 시간 초과 설정
ServerSocket 에서 감청 표 시 를 열 지 여 부 를 설정 합 니 다.
package netchat;
import java.io.*;
import java.net.*;
import javax.swing.JTextArea;
public class NetSocket {
private ServerSocket ssk;
private boolean isStop;
public NetSocket() {
isStop=false;
ssk=null;
}
/**
* @param port
* @throws IOException I / O
*/
public void startReceive(int port) throws IOException{
// TODO
ssk = new ServerSocket(port);
isStop=false;
ssk.setSoTimeout(5*10000);
new Thread(()-> {
while(!isStop) {
Socket sk=null;
try {
sk = ssk.accept();
} catch (IOException e) {
// TODO catch
e.printStackTrace();
}
new Thread(new ReceiveThread(sk)).start();
}
try {
ssk.close();
} catch (IOException e) {
// TODO catch
e.printStackTrace();
}
}).start();
}
/**
* Close ReceiveThread
*/
public void stopReceive() {
// TODO
isStop=true;
}
}
참고 문장
https://bbs.csdn.net/topics/250016069
https://blog.csdn.net/budapest/article/details/6941903
https://blog.csdn.net/weixin_41715077/article/details/88791499
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Rails Turbolinks를 페이지 단위로 비활성화하는 방법원래 Turobolinks란? Turbolinks는 링크를 생성하는 요소인 a 요소의 클릭을 후크로 하고, 이동한 페이지를 Ajax에서 가져옵니다. 그 후, 취득 페이지의 데이터가 천이 전의 페이지와 동일한 것이 있...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.