JAVA -- ServerSocket 닫 기

2726 단어 #JAVA
문제 설명
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

좋은 웹페이지 즐겨찾기