소켓과 패킷을 따로 만들어 관리하던 UDP와는 달리 Java에서 TCP는 직접적으로 소켓을 열어 관리한다.
이는 패킷을 보내기만하고 따로 접속은 관리하지않는 UDP와는 근본적으로 다른 TCP의 방식때문이다.
TCP는 접속을 하는 순간부터 끊을때까지 클라이언트와 서버의 연결이 지속되는 구조이다. 따라서, 신뢰성높고, 에러를 검출할 수 있는 방식으로 동작한다.
TCP를 열기 위해서는 서버쪽에서는 ServerSocket을, 클라이언트에서는 Socket을 생성해야한다.
여기서 host는 문자열이 들어갈 수 있다. DatagramPacket과는 또 다르다.(왜 여기에는 InetAdress를 넣고.. 저기서는 문자열을 넣는지.. )
생성된 소켓에 데이터를 읽고, 쓰는 방식을 위해 Socket은 getInputStream과 getOutputStream을 통해서 스트림 객체를 반환한다. 그러므로, 다음과 같은 방법으로 읽고 쓸 수 있다.
서버쪽에서 accept는 DatagramSocket에서 receive와 마찬가지로, 수행을 정지하고 입력을 기다린다. 이에 따른 반환 값은 java.net.Socket으로 이를 통해 데이터를 주고 받는다.
위에서는 서버쪽에서 PrintStream 객체로 포장해 java.io.PrintStream.print 를 통해서 해당 데이터를 출력한다.
반면에 클라이언트 쪽에서는 BufferedReader로 포장해서 java.io.BufferedReader.readLine 을 통해 해당 데이터를 읽었다.
여기서 교훈은, 많이 써야할 함수를 체크해서 결과에 잘 부응할 만한 클래스로 스트림을 묶어야한다는 점이다.
TCP 데이터를 주고 받는 소스는 다음과 같다.

이는 패킷을 보내기만하고 따로 접속은 관리하지않는 UDP와는 근본적으로 다른 TCP의 방식때문이다.
TCP는 접속을 하는 순간부터 끊을때까지 클라이언트와 서버의 연결이 지속되는 구조이다. 따라서, 신뢰성높고, 에러를 검출할 수 있는 방식으로 동작한다.
TCP를 열기 위해서는 서버쪽에서는 ServerSocket을, 클라이언트에서는 Socket을 생성해야한다.
(let [server (new java.net.ServerSocket port)] ... )
(let [daytime (new java.net.Socket host port)] ... )
여기서 host는 문자열이 들어갈 수 있다. DatagramPacket과는 또 다르다.(왜 여기에는 InetAdress를 넣고.. 저기서는 문자열을 넣는지.. )
생성된 소켓에 데이터를 읽고, 쓰는 방식을 위해 Socket은 getInputStream과 getOutputStream을 통해서 스트림 객체를 반환한다. 그러므로, 다음과 같은 방법으로 읽고 쓸 수 있다.
(let [nextClient (. server accept)
out (. nextClient getOutputStream)
pout (new java.io.PrintStream out)]
(. pout print (new java.util.Date))
(. out flush)
(. out close)
(. nextClient close))
(let [reader (new java.io.BufferedReader (new java.io.InputStreamReader (. daytime getInputStream)))]
(println (. reader readLine)))
서버쪽에서 accept는 DatagramSocket에서 receive와 마찬가지로, 수행을 정지하고 입력을 기다린다. 이에 따른 반환 값은 java.net.Socket으로 이를 통해 데이터를 주고 받는다.
위에서는 서버쪽에서 PrintStream 객체로 포장해 java.io.PrintStream.print 를 통해서 해당 데이터를 출력한다.
반면에 클라이언트 쪽에서는 BufferedReader로 포장해서 java.io.BufferedReader.readLine 을 통해 해당 데이터를 읽었다.
여기서 교훈은, 많이 써야할 함수를 체크해서 결과에 잘 부응할 만한 클래스로 스트림을 묶어야한다는 점이다.
TCP 데이터를 주고 받는 소스는 다음과 같다.
(ns time_server
(:import [java.net ServerSocket Socket]))
(defn daytime []
(let [server (new java.net.ServerSocket 10013)]
(do
(let [nextClient (. server accept)
out (. nextClient getOutputStream)
pout (new java.io.PrintStream out)]
(. pout print (new java.util.Date))
(. out flush)
(. out close)
(. nextClient close))
(. server close))))
(defn getday [host port]
(let [daytime (new java.net.Socket host port)]
(do
(. daytime setSoTimeout 2000)
(let [reader (new java.io.BufferedReader (new java.io.InputStreamReader (. daytime getInputStream)))]
(println (. reader readLine)))
(. daytime close))))

댓글 없음:
댓글 쓰기