java 서버 소켓을 만들고 소켓이 연결되면 소켓 입력 및 출력 스트림에 액세스 할 수있는 새 스레드를 만들고이 스레드는 입력 라인을 차단하고 처리합니다. in.자바 소켓 처리
BufferedReader의 readln
메서드는 입력 스트림이 끝날 때 null을 반환한다는 것을 알고 있습니다. 그렇다고해서 반드시 소켓이 닫혔다는 의미는 아닙니다. 이것은 무엇을 의미 하는가? 그래서 소켓을 닫으려면 close
메서드를 실행하고 싶습니다.
readln
메서드는 IOException을 throw 할 수 있으며 현재 차단중인 소켓에서 close
메서드를 호출하면 throw됩니다. 그 밖에 언제 던질 수 있습니까? 소켓이 여전히 던져진 후에도 여전히 열리거나 가비지 수집 등을 위해 항상 닫히고 닫힐 수 있습니까?
이것은 현재 제가 가지고있는 코드이며, 올바르게 연결 해제를 처리하는 방법을 알지 못합니다. 소켓에 disconnect
이 소켓에서 close
을 호출 할 것이므로 disconnect
메서드가 호출되면 소켓이 회선을 기다리는 동안 이것이 교착 상태에 빠질 수 있다고 생각합니다. 그러면 readLine
에 IOException
이 던져지며 그러면 catch 블록이 disconnect
을 다시 호출합니다.
- 소켓에 연결하고 입력을 듣고 별도의 스레드를 시작하는 연결 방법을 쓰기 :
public class SocketManager { private Socket socket = null; private PrintWriter out = null; private BufferedReader in = null; private String ip; private int port; private Object socketLock = new Object(); public SocketManager(String ip, int port) { this.ip = ip; this.port = port; } public void connect() throws UnableToConnectException, AlreadyConnectedException { synchronized(socketLock) { if (socket == null || socket.isClosed()) { throw (new AlreadyConnectedException()); } try { socket = new Socket(ip, port); out = new PrintWriter(socket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); } catch (IOException e) { throw (new UnableToConnectException()); } new Thread(new SocketThread()).start(); } } public void disconnect() throws NotConnectedException { synchronized(socketLock) { if (isConnected()) { throw (new NotConnectedException()); } try { socket.close(); } catch (IOException e) {} } } public boolean isConnected() { synchronized(socketLock) { return (socket != null && !socket.isClosed()); } } private class SocketThread implements Runnable { @Override public void run() { String inputLine = null; try { while((inputLine = in.readLine()) != null) { // do stuff } if (isConnected()) { try { disconnect(); } catch (NotConnectedException e) {} } } catch (IOException e) { // try and disconnect (if not already disconnected) and end thread if (isConnected()) { try { disconnect(); } catch (NotConnectedException e1) {} } } } } }
나는 기본적으로 다음을 달성하는 가장 좋은 방법을 알고 싶습니다.
- 소켓에서 연결을 끊고 입력을 수신하는 스레드를 종료하는 연결 해제 메소드를 작성합니다.
- 원격 소켓에 연결이 끊어진 시나리오를 처리하는 중입니다.
나는 java tutorial on sockets을 통해 읽었지만 제 의견으로는 이것에 대해서는 자세히 다루지 않습니다.
감사합니다.