본문 바로가기

JAVA/네트워크 프로그래밍

[JAVA] 소켓으로 서버에 쓰기(Client) 소켓에 입력 스트림뿐만 아니라 출력 스트림 또한 요청할 수 있다. 입력 스트림을 통해 데이터를 읽고 있는 동시에 출력 스트림을 사용하여 동시에 데이터를 보내는 것이 가능하지만, 대부분의 프로토콜은 동시에 읽고 쓰지 않도록 설계되어 있다. 즉, 한 번에 읽거나 쓰는 하나의 동작만 수행한다. 일반적으로 클라이언트가 요청을 보내면, 요청을 받은 후 서버가 응답을 보낸다. 그러고 나서 클라이언트가 또 다른 요청을 보내면, 서버는 또 다른 요청을 받은 후 응답을 보낸다. 이 과정은 어느 한쪽이 종료되거나 연결이 닫힐 때까지 계속된다. 양방향 TCP 프로토콜을 사용하는 간단한 예로 RFC 2229에 정의된 dict가 있다. 이 프로토콜에서 클라이언트는 dict 서버의 2628 포트에 대해 소켓을 열고 "DEFINE.. 더보기
[JAVA] 소켓으로 서버에서 읽기(Client) 위 예제는 Telnet 프로토콜을 이용하여 미국 국립표준기술연구소(NIST)의 daytime 서버에 13번 포트에 현재시간에 대한 요청을 보낸 것이다. 이 결과에서 "57634 16-09-03 06:46:59 50 0 0 150.2 UTC(NIST)" 라인이 daytime 서버에서 전송된 것이다. 소켓의 InputStream 을 사용하여 읽으면, 바로 이 값이 반환된다. 그 외의 다른 줄은 유닉스 셸이나 텔넷 프로그램에 의해 출력된 것이다. 지금은 소켓을 사용하여 코드상에서 동일한 결과를 얻는 방법을 보도록 하자. 먼저 time.nist.gov의 13번 포트에 대한 소켓을 연다. Socket socket = new Socket("time.nist.gov", 13); 이 코드는 객체를 만들 뿐만 아니라 실.. 더보기
[JAVA] 소켓의 기능과 동작 소켓이란 두 호스트 사이의 연결을 말한다. 소켓은 아래와 같은 기본적인 7가지 기능을 수행한다. ⊙ 원격 장비에 연결하기(connect) ⊙ 데이터 보내기(send) ⊙ 데이터 받기(recv)⊙ 연결 닫기(close) ⊙ 포트 지정하기(bind)⊙ 수신 대기하기(listen)⊙ 지정된 포트에 대해 원격 장비의 연결 받아들이기(accept) 자바의 Socket 클래스는 위에 나열된 기능 각각에 해당하는 메소드를 제공하며, 앞의 네 개는 서버와 클라이언트 모두에서 사용되고, 나머지 세 개는 클라이언트의 접속을 대기하는 기능으로 서버에서만 사용된다. 자바 프로그램은 보통 다음과 같은 방법으로 클라이언트 소켓을 사용한다. ⊙ 프로그램은 Socket 클래스의 생성자를 사용하여 새로운 소켓을 만든다.⊙ 생성된 소켓.. 더보기
[JAVA] 데이터그램과 소켓의 개요 인터넷을 통해 전달되는 데이터는 데이터그램(datagram)이라고 불리는 일정한 크기의 패킷으로 전송된다. 각각의 데이터그램은 헤더(header)와 페이로드(payload)를 포함하고 있다. 헤더에는 수신할 곳의 주소와 포트, 패킷을 송신한 곳의 주소와 포트, 데이터 손상을 탐지하기 위한 체크섬, 그 밖에 신뢰할 수 있는 전송을 위해 필요한 정보들이 포함되어있다. 페이로드에는 데이터 자체가 들어 있다. 그러나 데이터그램은 길이가 제한되어 있기 때문에, 종종 데이터를 다수의 패킷으로 분할하고 목적지에서 재조립할 필요가 있다. 그리고 또한 전송 중에 하나 이상의 패킷이 손실되거나 손상되어 재전송이 필요하거나, 패킷이 보낸 순서대로 도착하지 않을 경우 재정렬이 필요한 경우도 있다. 이러한 경우를 모두 처리하기.. 더보기
[JAVA] 입출력 스트림(Input Output Stream) 이전 예제에서 사용해 보았던 read() 메소드는 한 번에 한 개의 문자 밖에 읽지 못하였다.그 이유는 통신과 관계가 깊은데, 자세히 알아보기 위해서는 네트워크와 같이 공부하면 더 좋을 것 같았다.아래의 내용은 'Java Network Programming'이라는 책에서 공부한 내용을 요약한 것이다. 네트워크 프로그램의 가장 큰 비중을 차지하는 것이 바로 입출력(I/O)이다. 즉, 하나의 시스템에서 다른 시스템으로 데이터를 이동하는 일을 말한다. 바이트는 바이트일 뿐이며 대부분의 경우 텍스트를 클라이언트로 보내는 것은 파일에 데이터를 써 넣는 것과 크게 다르지 않다. 자바에서 I/O는 스트림(stream)에 내장되어 있다.입력 스트림은 데이터를 읽고, 출력 스트림은 데이터를 쓴다. 대개 스트림을 생성한 .. 더보기