2008/07/17 12

TCP 프로그래밍 - 멀티스레드를 이용한 에코 서버

멀티스레드를 이용한 에코 서버 서버가 클라이언트 여러 개를 동시에 처리하지 못하는 점을 해결하는 몇가지 방법이 있다. 그 중 한 가지 방법인 스레드를 이용한 방법을 사용한다. 서버는 연결된 클라이언트의 수만큼 소켓을 가지게 되는데, 각각의 소켓은 각각 별개로 동작해야 한다. 서버는 accept()로 대기하고 있다가 클라이언트가 접속하게되면 socket 객체를 반환하게 된다. 반환 받은 소켓은 스레드의 생성자에 전달된다. 그리고나서 스레드 객체를 시작하고 다시 메인 스레드는 accept()로 대기하게 된다. 실제로 클라이언트와 통신을 하는 것은 스레드 객체의 run() 메소드 안에서 일어난다. 멀티스레드 에코 서버 프로그래밍 import java.net.*; import java.io.*; public c..

TCP 프로그래밍 - 간단한 에코 클라이언트/서버 프로래밍

간단한 에코 클라이언트/서버 프로래밍 에코(Echo)는 말 그대로 메이리를 의미한다. 클라이언트가 보낸 데이터를 서버 쪽에서 받아들여, 클라이언트에게 그대로 다시 보내주는 것을 의미한다. 에코 클라이언트와 서버는 각각 다음과 같은 방식으로 동작한다. 에코서버 1. 10001번 포트에서 동작하는 ServerSocket을 생성한다. 2. ServerSocket의 accept() 메소드를 실행해서 클라이언트의 접속을 대기한다. 3. 클라이언트가 접속할 경우 accept() 메소드는 Socket 객체를 반환한다. 4. 반환 받은 Socket으로 InputStream과 OutputStream을 구한다. 5. InputStream은 BufferedReader 형식으로 변환하고 OutputStream은 PrintWr..

XML과 JSP(TLD, web.xml)

TLD TLD(Tag Library Descriptor) 파일 태그 라이브러리에 대한 설정 정보를 담고 있는 파일이며, 함수를 구현한 클래스, 메소드 시그너쳐(형태), 함수의 이름에 대한 정보를 담고 있다. 이것은 태그 핸들러와 태그를 연결하는 XML 파일로 크게 XML 문서 선언, XML 스키마 지정, 태그 정보 지정 부분으로 구성된다. 보통 WEB-INF 폴더의 하위에 tld 폴더 생성 후 확장자 tld로 파일 저장한다. XML 문서 선언 XML 문서의 호환성을 위한 선언 부분이며, 모든 TLD 문서에 동일하게 사용한다. XML 스키마 지정 현재 XML 문서의 규칙을 담고 있는 스키마 파일을 지정함. 모든 TLD 문서에 동일하게 사용된다. 복잡하므로 실수를 방지하기 위해, 직접 입력하지 말고 가능한 ..

XML과 SAX

SAX 첨부파일 SAX API를 활용한 요소 추출 DOM과 마찬가지로 XML 문서의 일부 요소 데이터를 추출해서 새로운 XML 문서를 작성할 수 있다. ※ startElement(), endElement(), characters() 메소드를 활용하여 학생의 이름(name) 요소와 텍스트 데이터를 추출한다. characters() 메소드에서는 이름 데이터의 텍스트만 추출하게 isPrint라는 변수를 사용하며, 학생 이름 데이터인지 구분한다. isPrint 변수는 name 요소가 시작할 때는 true 값을 저장하고, 종료할 때는 false 값을 저장한다. 이렇게 하면 isPrint가 true일 때만 텍스트 데이터를 추출할 수 있다. 추출한 데이터는 버퍼에 임시 저장해 놓고 문서를 종료할 때 파일에 출력한다...

TCP 프로그래밍

TCP(Transfer Control Protocol) 프로그래밍 기본 TCP는 다른 말로 스트림 통신 프로토콜이라고 부르며, TCP 통신을 하려면 양쪽의 소켓이 연결된 상태여야만 가능하다. 그렇기 때문에 연결지향 프로토콜이라고도 한다. TCP 프로그래밍에서 가장 중요한 클래스는 java.net.ServerSocket과 java.net.Socket이다. ServerSocket은 서버 쪽에서 클라이언트의 접속을 대기하기 위해서 반드시 필요한 클래스며, Socket은 서버와 클라이언트가 통신하기 위해서 반드시 필요한 클래스다. TCP방법을 이용해서 클라이언트와 서버가 통ㅇ신하려면 양쪽에 Socket 객체가 있어야 한다. 이때 소켓을 생성하는 방법은 클라이언트 쪽과 서버쪽이 다르다. 서버와 클라이언트의 가장 ..

InetAddress 클래스를 활용한 도메인과 IP 변환(nslookup 구현)

윈도우나 유닉스 운영체제에서는 도메인 주소를 IP 주소를 구하거나 반대로 IP 주소를 이용해서 도메인 주소를 알아내는 프로그램을 제공한다. 해당 프로그램의 이름은 nslookup이다. 실행된 결과는 원래 www.yahoo.com에 대응되는 IP를 여러 개가 나와야 하나 주소창 뒤에 .local이 붙어 하나만 출력되었다. 실제로는 대응되는 IP가 여러 개이다. getAllByName() 메소드의 수행 결과가 배열로 나오는 것은 IP가 여러 개가 존재할 수 있기 때문이다. InetAddress 클래스를 이용한 nslookup 명령 구현 InetAddress는 IP나 도메인을 이용해서 여러 가지 유용한 정보를 얻을 수 있는 클래스이다. nslookup 명령을 구현하고 실행하기 위한 순서 1. InetAddre..

InetAddress 클래스

InetAddress 클래스 네트워크 내에서 컴퓨터 간에 통신을 하려면 IP 주소를 알고 있어야 한다. java.net 패키지에는 IP와 관련된 중요한 클래스가 있는데, 바로 InetAddress다. InetAddress는 도메인 주소를 IP 주소로 변환하거나 반대로 IP 주소를 도메인 주소로 변경할 수 있으며, 문자열이나 바이트 배열 형태로 IP주소에 대한 정보를 얻을 수도 있다. 또한 현재 컴퓨터의 이름도 구할 수 있다. InetAddress 객체는 생성자를 이용해서 객체를 생성하지 않고, 정적(static)인 특성이 있다는 다음의 메소드를 이용해서 객체를 생성한다. InetAddress가 사용되는 메소드 메소드 설명 static InetAddress[] getAllByName(String host)..

소켓

소켓 네트워크 프로그래밍에서 소켓이란 "사용자에게 네트워크에 접근할 수 있는 인터페이스를 제공해준다"라는 의미가 있다. 소켓을 사용하려면 소켓 생성(소켓 열기), 소켓을 통한 송신과 수신, 소켓 소멸(소켓 닫기)의 세가지 과정을 이해해야 한다. 소켓은 TCP와 UDP를 이용한 두가지 방법이 있으며 세가지 소켓 형식이 있다. 소켓은 유닉스 시스템에서 파일 입출려과 같은 방식으로 사용되도록 만들어져 있다. 유닉스 시스템은 파일을 입출력하기 위해서 다음과 같은 과정을 거친다. 파일 열기 → 파일 읽기/쓰기 → 파일 닫기 소켓도 위의 방식을 그대로 받아들여 다음과 같이 같은 방식으로 통신하도록 설계도었다. 소켓 열기 → 소켓을 통한 읽기/쓰기 → 소켓 닫기 소켓의 세 가지 형식 소켓의 세 가지 형식에는 SOCK..

객체 스트림 - 예외

객체 스트림 객체 스트림의 사용은 쉽지만 기능은 강력하다. 그리고 객체 스트림은 RMI에 내부적으로 사용되는 기술이므로 객체 스트림을 잘 알고 있어야 한다. ※ 객체 스트림을 사용할 때 java.io.Serializable 인터페이스를 꼭 구현한다. (Serializable은 구현할 메소드가 없는 마크 인터페이스이다.) 자바 API의 java.lang 패키지에서 어떠한 클래스가 java.io.Serializable 인터페이스를 구현하는지 확인한다. java.io.Serialzable 인터페이스를 구현한 클래스는 다른 클래스의 필드일 경우, 포함하고 있는 클래스가 직렬화될 때 함께 직렬화할 수 있기 때문이다. 객체 스트림에서 주의해야 할 점은, 파일에 객체 기반 스트림으로 저장할 때 객체 여러 개를 이어서..

객체 스트림 - ObjectOutputStream와 ObjectInputStream

ObjectOutputStream 클래스의 생성자와 메소드 ObjectOutputStream 클래스는 객체를 직렬화하기 위해서 사용된다. ObjectOutputStream 클래스는 다음과 같이 선언되어 있다. public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants ObjectOutputStream 클래스에 있는 생성자는 두 가지인데, 보통 OutputStream을 인자로 전달받는 생성자가 사용된다. public ObjectOutputStream(OutputStream out) throws IOException ObjectOutputStream의 생성자는 인자로 OutputStream..