본문 바로가기

spring

자바 네트워크(Network) - UDP방식 예제 UDP방식은 TCP와 달리 하나의 소켓으로 통신한다. DatagramSocket이라는 것으로.. 이 클래스에 자세한것은 자바 API를 찾아보자. http://docs.oracle.com/javase/7/docs/api/ 일단 확인 해야 할 부분은 Constructor중 파라미터가 없는건 클라이언트용. 파라미터가 있는건(포트번호) 서버에서 사용할것이라는것만 알아두자. 그리고 DatagramePacket 클래스도 잘 살펴보자. 우선 오늘의 점심 메뉴를 서버에 요청해서 가져 오는걸 해보자. 1. 점심메뉴를 랜덤으로 뽑아줄 클래스를 하나 만들자. 2. 서버를 만들어 보자. 3. 클라이언트를 만들어 보자 자세히 보면 클라이언트와 서버 프로그램이 거의 비슷하다 소켓은 DatagramSocket이라는거 하나만 사용하.. 더보기
자바 네트워크(Network) - Thread를 이용한 TCP/IP 예제 Thread를 이용한 TCP / IP예제이다. 복수의 클라이언트에서 요청 받은 것을 서버에서는 각각 쓰레드를 생성해서 에코형식의 메세지를 클라이언트에게 전달 해 준다. 우선 서버 프로그램 코드를 보자. 이전에 썼던 내용과 다를게 없다. 서버 소켓, 클라이언트용 소켓 생성해서 무한 루프 돌면서 클라이언트 요청을 받는다. 다만 while문에서 쓰레드를 각각 생성해서 쓰레드에서 에코가 되게 요청단위로 처리해 준다. 쓰레드를 구현한 소스를 보자. 쓰레드기 때문에 서버 프로그램에서 클라이언트 요청이 들어 왔을때 생성자로 요청을 읽고 다시 요청응답을 돌려주기 위해서 InputStream과 OutputStream을 생성하였다. 그리고 run에서는 요청 내용을 읽고 다시 클라이언트로 요청내용을 그대로 돌려 준다(에코,.. 더보기
자바 네트워크(Network) - 소켓(Socket)동작의 원리 이전에 한것은 네트워크 프로그래밍을 사용할때 자주 사용하는 유틸성 클래스를 살펴 봤다. TCP/IP방식의 기본적인 동작 방식은 아래 그림과 같다. TCP/IP에서 서버에서는 클라이언트 요청을 받아서 데이터 처리를 하는데 우선 서버는 클라이언트 요청을 받아 들이는 소켓이 있다. 일명 서버 소켓 클라이언트에서 소켓생성해서 서버로 접속하면 이를 받는 역할을 하는 소켓이 있는데 이후 곧바로 서버내 다른 소켓으로 자신이 받은 요청을 넘긴다. 그래야 수많은 클라이언트 요청이 을 서버에서 받아 들일수 있다. 소스를 보면 소켓이 두개 생성이 되어 있다면 그건 서버용 프로그램이고 하나면 클라이언트 프로그램이라고 생각하면 된다. 정리하면 서버는 최소한 두개의 소켓이 있어야 한다. ServerSocket과 이를 할당 받을 .. 더보기
자바 네트워크(Network) - 프로토콜(Protocol) - 프로토콜 (Protocol) 일종의 약정 규약, 규칙. 네트워크를 연결함에 있어서 서로 약정, 규약을 맺지 않으면 통신 할 수 없다. - 프로토콜 종류 : tcp/ip, http, ftp, udp, 스트크래프트를 할때의 IPX/SPX 등등.. - 프로그래밍을 위한 대표적인 2개의 프로토콜을 알아보자. 1. TCP / IP * 연결 지향성 : 예를 들어 두대의 컴퓨터 사이에 미리 연결을 설정하고 나서 그 다음에 데이터를 주고 받겠다는 (통신)이야기 * 어떤 하나의 작업을 처리하는 중 다른것을 할 수 없다. (대용량 데이터 처리 적합) * 보내는 데이터를 작은 단위로 쪼개서 보내는데 이를 패킷이라 부른다. 받는 부분에서는 받은 패킷을 받아서 다시 조립한다. 서로 규약, 약속이 되어 있지 않으면 처리 할 .. 더보기
JAVA I/O (자바입출력) - 랩퍼클래스 (Wrapper Class) 와 File클래스 자바 랩퍼클래스를 알아보자. 사실 랩퍼클래스는 자바 I/O와 크게 상관은 없다. anyway 우선 프리미티브타입 int i를 보자 변수 i는 데이터 저장 하는것 이외에 아무런 사용용도가 없다. i.size()나 i.length()라는게 존재 할 수가 없다. 랩퍼클래스를 사용하면 여러가지 함수를 사용할수 있다. Integer, Double, Char등..이 랩퍼클래스이다(자바 API를 살펴보자) 일례로 흔히 우리가 많이 사용하는것중 하나가 parseInt, parseDouble같은것이다. 자바I/O중 BufferedReader로 읽으면 전부다 String타입으로 읽혀지는데 이때 숫자도 String으로 읽혀진다. 이때 랩퍼클래스 Integer.parseInt(String)를 사용하면 int변환시켜서 값 계산.. 더보기
JAVA I/O (자바입출력) - 객체 직렬화 (ObjectInputStream /ObjectOutputStream) 객체 직렬화는 생성한 객체를 바이트 형태로 다른 저장 장치등으로 내보내는 방법을 말한다. 예제로 확인하자. 우선 저장할 클래스를 하나 만들어 보자. 사원정보에 대한 클래스이다. 중요한것은 이 클래스를 직렬화 하겠다는것을 명시해야 하는데 이를 위해서 꼭 해당 클래스에 Serializable을 implements 받아야 한다. 그러면 사원정보 클래스를 직렬화하여 저장하는 클래스를 보자. 객체를 저장하는거지만 이것 또한 기본 바탕은 바이트 스트림이다. 따라서 저장할 파일을 지정하고 FileOutputStream 객체를 생성한 후 오브젝트 저장시 사용되는 ObjectOutputStream을 이용해서 객체 내용을 바이트 타입으로 파일로 내보낸다. 그리고 난후 writeObject(object reference)를.. 더보기
JAVA I/O (자바입출력) - PrintStream / PrintWrite 클래스 PrintStream이란 무엇가 출력장치에 상관없이 조금더 편하고 쉽게 출력을 도와주는 스트림 클래스이다. 예를 들어 print()나 println()도 다 여기 범주에 포함된다. 그런데 그 만큼 사용자 입장에서 만든것이기 때문에 정교하게 하는것은 약간 무리다. 우선 처음 해야 할 일은 자바 API를 보자. http://docs.oracle.com/javase/7/docs/api/ 예제를 살펴보자. 이전에 했던 스트림읽기와 차이점이 별로 없다. 파일을 읽어서 버퍼에 넣고 while문으로 돌려서 찍는다. 항상 close()를 잊지 말자. 두번째 예제를 보자 저장된 파일을 읽어다가 화면에다 찍는것이다. 보면 PrintWriter함수 중에는 printf라는 메소드가 있는데 이는 표준 출력함수다. 문자열이나 특.. 더보기
JAVA I/O (자바입출력) - FileReader와 FileWriter 클래스 바이트 스트림의 FileInputStream과 FileOutputStream의 문자스트림을 처리하는 버전이라고 보면 되겠다. 내용은 거의 비슷하다. 입력한 값을 파일에 써서 저장을 먼저 해보자. 위의 예제를 보면 BufferedReader를 사용해서 한라인씩 찍는다. 소소를 보면 이전에 했던걸 기억하면 그다지 크게 어려움은 없다. 그럼 파일이 잘 생성되고 써졌나. 읽어보자. 아래 예제를 보자. 읽는건 정말 간단하자. 더보기
JAVA I/O (자바입출력) - CharacterStream 문자 스트림을 살펴보자. 실제 내부적으로는 바이트 스트림 방식으로 작동하지만 사용자 입장에서 문자 처리를 편하게 위해서 만들어 졌다. 우선 바이트스트림으로 쓸때 한글은 2바이트이기 때문에 깨져 보였는데 문자스트림을 쓰면 안깨지고 쓸 수 있다. reader와 writer를 잘 생각해보자. 예제를 살펴보자. 다른것 없다. 바이트 스트림으로 구현했던것을 문자 스트림으로 바꾸기만 하면 된다. 그러기 위해서는 InputStreamReader와 BufferedReader를 사용하자. 이는 스트림을 문자로 바꿔주는 역할을 한다. 그리고 예제를 보면 두가지 타입이 있다 InputStreamReader는 한글자씩 읽고 찍는다. BufferedReader는 한꺼번에 찍는다. 결과값을 보면 한글이 안깨지는것을 볼수 있다. 더보기
JAVA I/O (자바입출력) - RandomAccessFile 원래 스트림(Stream)은 원칙적으로 순서대로 처리 된다. 하지만 예외적으로 접근처리를 할 수 있는것이 있다. 바로 RandomAccessFile이라는 것이다. 말 그대로 임의로 파일에 접근하는것이다. 자바 API를 보면 이 클래스는 Input이나 OutputStream같은 Stream으로 상속 받는게 아니고 바로 위의 클래스가 Object다. 메소드들 중 살펴볼 만한것은 seek메소드다. 레코드 바늘 처럼 원하는 곳을 찍어서 갈 수 있다. 무슨말이냐면 데이터 1,2,3,4,5,6을 Stream객체를 사용해서 쓰면 가져올때도 순차적으로 가져와야 하는데 RandomAccessFile을 쓰면 위치를 지정해서 꺼내올수 있다. 예제를 살펴보자. 우선 저장할 더블 배열 값을 선언한다. RandomAccessFi.. 더보기