본문 바로가기

JAVA/네트워크 프로그래밍

[JAVA] 서버 소켓 닫기(Server) 서버 소켓의 사용이 끝났으면 해당 소켓을 닫아야 한다. 특히 프로그램이 서버 소켓 사용 후에 바로 종료하지 않고 한동안 계속 실행되어야 할 경우 더 중요하다. 사용이 끝난 서버소켓을 닫지 않으면 다른 프로그램이 해당 포트를 사용할 수 없다. ServerSocket을 닫는 것과 Socket을 닫는 것을 혼동해서는 안 된다. ServerSocekt을 닫으면 사용중인 로컬 호스트의 포트가 해제되며 다른 서버가 해당 포트를 바인드 할 수 있게 된다. 또한 해당 ServerSocket을 통해 수용된 모든 소켓의 연결이 끊어진다. 서버 소켓은 프로그램이 종료될 때 자동으로 닫힌다. 그래서 ServerSocket의 사용이 끝나고 곧바로 프로그램을 종료할 예정이라면 꼭 닫아야 할 필요는 없다. 하지만 종료한다고 문제가.. 더보기
[JAVA] 소켓으로 서버에 쓰기(Server) 대부분의 프로토콜이 서버에게 읽기와 쓰기를 모두 요구하기 때문에, 이를 구현할 줄 알아야 한다. 이전과 동일하게 연결을 받아들이지만, 이번에는 InputStream과 OutputStream을 모두 요청한다. InputStream을 이용하여 클라이언트가 보내는 내용을 읽고, OutputStream을 사용하여 클라이언트에게 쓴다. 이 과정에서 중요한 점은 프로토콜을 잘 이해하고, 읽어야 할 때와 써야 할 때를 잘 구분하는 것이다. RFC 862에 정의된 에코프로토콜은 서버와 클라이언트가 데이터를 주고 받는 가장 간단한 서비스 중의 하나이다. 클라이언트는 에코 서버의 포트 7번에 대해 소켓을 열고 데이터를 보낸다. 그리고 서버는 받은 데이터를 다시 돌려보낸다. 에코 프로토콜은 라우터나 방화벽의 오동작으로 인해.. 더보기
[JAVA] 서버 소켓 ② Binary Data 보내기 텍스트 대신 바이너리 데이터를 보내는 방법은 Writer를 사용하여 문자열을 전송하는 것 대신에 OutputStream을 사용하여 바이트 배열을 전송하면 된다. 아래의 예제는 RFC 868에 기술된 타임 프로토콜을 따르는 반복 시간 서버이다. 클라이언트가 연결되면, 서버는 1900년 1월 1일 자정 이후의 시간을 초로 표현한 4바이트, 빅엔디안, 부호 없는 정수 값을 보낸다. 또다시, 현재 시간은 Date 객체를 생성하여 구한다. 그러나 자바의 Date 클래스는 1970년 1월 1일 자정 이후의 시간을 밀리초 단위로 세기 때문에 변환이 필요하다. package network; import java.io.*;import java.net.*;import java.util.Date; public class T.. 더보기
[JAVA] 서버 소켓 사용하기 ① 위는 time-a.nist.gov에 연결하여 시간을 받아 온 것이다. 나만의 daytime 서버를 만들어보자. 우선 포트 13번에 대기하는 서버 소켓을 만든다. ServerSocket server = new ServerSocket(13); 다음, 연결을 수용한다. Socket connection = server.accept(); accept()가 호출되면 프로그램은 여기서 실행을 멈추고 클라이언트 포크가 13번으로 연결할 때까지 무한 대기 한다. 클라이언트가 연결되면 accept() 메소드는 Socket 객체를 반환한다. 반환된 연결은 java.net.Socket 객체 형태로 반환되며 클라이언트에서 사용한 것과 같다. daytime 프로토콜은 대화할 서버가 필요하므로 소켓에서 OutputStream 을 .. 더보기
[JAVA] 서버 소켓 서버는 클라이언트를 구현할때 사용하는 소켓만으로는 구현할 수 없다. 클라이언트는 서버와 대화를 할 때를 제외하고는 소켓을 사용하지 않는다는 점도 있고, Socket 객체를 생성하기 위해서는 접속하고자 하는 인터넷 호스트에 대해서 알아야만 한다. 서버를 작성할 때에는 누가 서버에 접속할지, 언제 접속할지는 신경쓰지 않아도 된다. 클라이언트의 연결 요청을 수용하는 서버 프로그램을 위해, 자바는 서버 소켓을 나타내는 ServerSocket 클래스를 제공한다. 서버 소켓은 연결을 기다리며, 연결을 설정한 후 부터는 서버는 반환된 보통의 Socket 객체를 사용하여 클라이언트에게 데이터를 전송한다. 데이터는 항상 반환된 이 보통의 소켓을 통해 보내진다. ServerSocket을 사용하기 전에... ServerSo.. 더보기
[JAVA] 소켓 옵션 설정하기(Client) 소켓 옵션은 자바 Socket 클래스 내부의 네이티브 소켓이 데이터를 보내거나 받는 방법을 지정한다. 자바 클라이언트 소켓에 대한 9가지 옵션 ▶ TCP_NODELAY▶ SO_BINDADDR▶ SO_TIMEOUT▶ SO_LINGER▶ SO_SNDBUF▶ SO_RCVBUF▶ SO_KEEPALIVE▶ OOBINLINE▶ IP_TOS TCP_NODELAY public void setTcpNoDelay(boolean on) throws SocketException public boolean getTcpNoDelay() throws SocketException TCP_NODELAY의 설정을 true로 하면 패킷의 크기에 상관없이 가능한 한 빨리 패킷을 전송한다. 일반적으로 작은 패킷은 전송하기 전에 큰 패킷 하나.. 더보기
[JAVA] 종료된 소켓과 연결된 소켓(Client) isClosed() 메소드는 소켓이 닫혀있는 경우 true, 아닌 경우 false를 반환한다. 소켓의 상태가 불확실한 경우 IOException이 발생할 위험을 감수하는 것 보다 이 메소드를 사용하는 것이 좋다. if(socket.inClosed() {//소켓이 닫혀 있는 경우 처리...} else {//소켓이 열려 있는 경우 처리...} 그러나 이 방법도 완벽하지는 않다. 만약 소켓이 최초에 연결된 적이 없는 경우 소켓은 확실히 열려 있지는 않지만 isClosed()메소드는 false를 반환한다. Socket 클래스는 isConnected() 메소드도 제공한다. 메소드의 이름만 보고는 소켓이 현재 연결되어 있는지 알려주는 것 같지만, 이 메소드는 소켓이 원격 호스트에 연결된 적이 있는지 여부를 알려준다.. 더보기
[JAVA] 소켓 정보 얻기(Client) 소켓 객체는 get 메소드를 사용하여 접근할 수 있는 몇 가지 속성을 제공한다. ◎ 원격 주소 ◎ 원격 포트◎ 로컬 주소◎ 로컬 포트 이 속성에 접근하기 위한 get메소드는 public InetAddress getInetAddress()public int getPort()public InetAddress getLocalAddress()public intgetLocalPort() set 메소드는 존재하지 않는다. 이 속성들은 소켓이 연결되자마자 설정되며 고정되어 있다. getInetAddress() 그리고 getPort() 메소드는 소켓이 연결된 원격 호스트와 포트를 알려준다. 또는 연결이 종료된 경우 연결된 당시의 호스트와 포트를 알려준다. getLocalAddress()와 getLocalPost() 메.. 더보기
[JAVA] 소켓 주소 및 프록시 서버(Client) SocketAddress 클래스는 연결 끝점(endpoint)를 나타낸다. 이 클래스는 추상클래스 이다. 사실상 현재는 TCP/IP 소켓만이 지원되며, 우리가 사용하는 소켓 주소들은 전부 InteSocketAddress의 인스턴스이다. SocketAddress 클래스를 사용하는 목적은 원본 소켓의 연결이 끊어지거나 GC(Garbage Collector)에 의해 사라진 경우에도 새로운 소켓을 생성하는 데 재사용할 수 있는 IP 주소와 포트 같은 일시적인 소켓 연결 정보를 위한 간편한 저장소를 제공하기 위함이다. 이를 위해서 Socket 클래스는 SocketAddress 객체를 반환하는 두 개의 메소드를 제공한다. public SocketAddress getRemoteSocketAddress()//연결된 시.. 더보기
[JAVA] 소켓 생성과 연결(Client) 소켓 생성과 연결 java.net.Socket 클래스는 클라이언트 측의 TCP 기능을 수행하기 위한 자바의 기본 클래스이다. 그리고 URL, URLConnection, Applet, JEditorPane 같은 TCP 네트워크 연결을 생성하는 클라이언트 기반의 클래스들 역시 내부적으로 결국에는 java.net.Socket의 메소드를 호출한다. java.net.Socket 클래스 자체는 호스트 운영체제의 로컬 TCP 스택과 통신을 위해 네이티브 코드를 사용한다. 기본 생성자 각각의 소켓 생성자는 연결할 호스트와 포트를 매개변수로 전달받는다. 호스트 매개변수는 InetAddress 또는 String 타입으로 전달되며, 포트는 1에서 65535까지 int 타입으로 전달된다. public Socket(String.. 더보기