어디서부터 어떻게 설명 드려야 할지 모르겠어서 
http 통신에 기초해서  xml 파서 등등의 상위 레벨보다는 그 기초가 되는 부분부터 해서

질문하신 분의 상황에 맞춰서 해당 부분만 설명 드리겠습니다.

소켓 방식까지 포함해서 전체적으로 포괄적으로 설명 드리기엔........양이 너무 많네요.

하여튼 제가 아는 한에서 설명 드리면

 

1. [서버]  - [클라이언트] DATA 통신은 간단하게 말해서 서버와 클라이언트 가 DATA 를 0101010101 형태로 주고 받는 

   것입니다.  이 01010 들이 모여서 <html>이 되기도 하고 <xml> 이라는 문자가 되기도 하는 것이지요.

   - 보통 웹페이들은 [클라이언트] 가 [서버]에서 뿌려주는 DATA를 가져와 이를 익스플로어라는 프로그램이 파싱해서 

     text/문자로 사용자에게 보여주는 것이죠.

 

2. XML 파서 예제 소스를 열어 보면 NSURL 을 사용 해서 [서버]에 [DATA]를 Request 를 할 것입니다.XML 파서용 NSURL 

   Request 라고 해서 특별 한 것이 아니라 txt나 이미지 기타 DATA를 Request 할 때와 같습니다. DATA 는 010101010101 형태

   이고 [서버]는 이것을 요청에 따라 뿌려주면 되는 것이고 [클라이언트]는 이 정보를 가지고 익스플로어가 웹페이지를

   보여주는 것 처럼 이미지,xml문서,txt 문서로 분석(파싱)하면 됩니다. NSURL 이 아니라 다른 Nerwork 방식이라도 이 부분은 

   같습니다. 어떻게 가져 오느냐 의 문제지 어떤 DATA를 가져 왔느냐는 그 DATA를 가져와서 분석 하는 놈에 따라 틀린 거니까요

 

 

위의 두가지 개념에 대해 이미 알고 계시거나 제 글을 보고 이해가 되셨나요?

다시 한번 위 과정을 요약해서 말씀 드리면 

 

- [서버]는 DATA 를 보낸다

- [클라이언트]는 DATA 를 받는다. (Connector 가 해주는 역할(대표적으로 NSURL))

- [클라이언트]는 DATA 를 분석한다.(Parser 가 해주는 역할(글쓴이께서 사용하실 XML Parser 가 한 예 입니다.)

 

이렇게 크게 말씀 드릴 수 있겠네요.

 

이제 글쓴이 께서 원하시는 동작을 단계별로 풀이해서 설명 드려 보겠습니다.

 

1. [클라이언트]는 서버에 DATA를 Request 한다.

    - 브라우저 창에 http://www.naver.com 이라고 주소를 치고 엔터를 치는 것과 같은 동작

    - NSURL 에서는 Request 를 하는 동작

 

2. [서버]는 [클라이언트]의 요청에 따라 DATA들을 write 해줍니다.

   - ASP 로 하면 response.write 가 되겠죠.(<html><table>어저꾸저쩌구</table></html> )

     xml이라고 쳐도 다를 건 없습니다. (<html><table>어저꾸저쩌구</table></html> ) 대신 XML 구문에 맞춰서

     (<xml></xml>) 로 write 만 해주시면 됩니다.

   - 다른 언어도 마찬 가지입니다. write 만 해주시면 됩니다. 해당 http://aaa.bbb:8080 을 브라우저에 넣었을 때

     소스 보기로 해당 페이지 내용이 보이기만 하면 됩니다.

   - http://aaa.bbb:8080  를 [클라이언트]가 열었을 때 MySQL 로 Data 를 가져와 화면에 XML 구문에 맞춰

    보내고 싶은 DATA 를 뿌려주시면 됩니다.

 

3.[클라이언트] 는 [서버]가 write 해준 DATA 를 얻어 옵니다. 보통 저는 이걸 긁어 온다고 합니다.

 

4.[클라이언트]는  [서버]가 wirte 해준 DATA를 받아서 분석 합니다.

   - 웹브라우저로 치면 html 태그 등을 구분해서 이미지/text/표/그림 등의 형태로 DATA 를 바꿔 브라우저 화면에 보여주는

    작업입니다.

   - 말씀 하신 XML파서 는 이 DATA 를 가지고 xml 태그를 기준으로 DATA와 구분자 등을 구분 하는 녀석이죠.

 

이렇게 4단계를 거치면 XML 을 받아 오는 과정이 끝납니다.

XML 이라고 해서 특별히 뿌려 줄때  XML 파일로 만들 필요는 없고 XML 파일 안에 들어갈 TEXT 들을

그냥 뿌려줘도 됩니다. 

 

웹페이지도 메모장에서 여시면 소스코드가 그대로 보이는 것처럼

DATA자체는 그냥 형식에 맞게만 주고 받으면 됩니다.문제는 그것을 분석하는 녀석이죠.

분석하는 녀석이 메모장이면 text 형태로 다 보여주는 것이고 익스플로러 면 이미지/TEXT/표 등의 형태로 보여주는 거죠.

 

이렇게 http방식으로 request 에 의한 write 방식 말고 파일 자체를 받으시려면 socket을 열어 사용 하셔야 할텐데 

그렇다면 매번 클라이언트의 요청이 있을 때마다 file을 생성하고 write 해주는 서버를 구성 하셔야 할텐데

질문자의 글을 보니 이것보다는 웹페이지를 만들고 누군가 해당 페이지에 접근 했을때

MySQL 을 이용해서 데이터를 가져와 화면에 XML 형태로 해당 DATA를 write 하는 방식을 사용 하시는 것이

익숙 하실 것 같아 위의 방식 대로 설명 했습니다.

 

자 그럼 위에 말씀 드린 것을 토대로 예제 소스를 하나 올리겠습니다.

제가 직접 개발한 소스는 아니고 다른 고마우신 분이 올려주신 소스를 활용해서 사용 중입니다.

그분이 이글을 보신다면..고맙다는 말 전하고 싶네요

NSURL 을 사용 했습니다.

 

[self requestUrl:@"http://www.naver.com" ];

 

을 하시면 naver.com의 메인 페이지의 소스 코드가

만드신 xml 페이지 주소를 넣는다면 xml 구분이 찍힐것입니다.

XML 파서를 검색 해 보시면 아래에서 receivedData 를 가지고 파싱하는 예제가 많으니

해당 예제를 보고 하시면 될 듯 합니다.

저도 아래 소스에 파서부분은 검색해서 찾은 소스를 기본으로 붙여서 만들 었습니다.

파서 소스는 예제 소스가 많은 편이라 쉽게 붙이 실수 있을 것입니다.

 

쓰다보니 양이 어마 어마 해졌네요.....

프로젝트 중간에 짬이 난게 다행이네요..^^

저도 여기서 다른 분들 도움을 많이 받아서...그냥 지나치치 못하고 주저리 주저리 남겨 봅니다.

그럼 좋은 개발 하시길 빕니다.

 

NSString  *mData;
NSURLResponse *mNSURLResponse;
NSMutableData *receivedData;

 

//1번 단계: requestUrl

//2번은 서버가 해줄일

//3번 단계 :didReceiveData

//4번 단계 :connectionDidFinishLoading

 

- (BOOL)requestUrl:(NSString *)url {
  // URL 접속 초기화
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] 
                                                  cachePolicy:NSURLRequestUseProtocolCachePolicy 
                                                   timeoutInterval:15.0]; 

 

 // GET 방식
 [request setHTTPMethod:@"GET"];

 

 // POST 방식은 
 // [request setHTTPMethod:@"POST"]; // POST로 선언하고
 // [request setHTTPBody:[bodyString dataUsingEncoding:NSUTF8StringEncoding]];

 // 전송할 데이터를 변수명=값&변수명=값 형태의 문자열로 등록

 // 헤더  추가가 필요하면 아래 메소드를 이용
 // [request setValue:value forHTTPHeaderField:key];

 

 NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

if (connection) { 
       receivedData = [[NSMutableData data] retain]; // 수신할 데이터를 받을 공간을 마련
       return YES;
 }

 return NO;
}

 

//DATA 가 한번에 전체가 오는 것이 아니라 네트워크 상태에 따라 조금 씩 오기때문에 DATA 가 올때마다 호출 됩니다. 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
     [receivedData appendData:data]; 
}

 

//맨처음 DATA 를 주고 받기 시작 했을 때 Header 가 옵니다. 요청에 의한 정보가 옵니다.

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)aResponse {
   [receivedData setLength:0]; 
   mNSURLResponse = aResponse;
}

 

//에러가 발생 했을 때 옵니다.
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
   NSLog(@"Error : ", [error localizedDescription]);
}

 

//모든 DATA 를 받았을 때 호출 됩니다.
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

 //받은 receivedData 를 UTF8의 TEXT 형태로 바꿔 줍니다.
 mData = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding]; 

 

NSLog(@"%@",mData); //mData를 찍어 봅니다. url 에 www.naver.com 을 넣었다면 해당 페이지에서 소스 보기 했을 때 나오는 구문들이 나올 것입니다.

 

//파서 를 붙인다면 여기다 붙이세요 receivedData 를 가지고 붙이시면 됩니다.

 


 [urlConnection release];
 if(receivedData!=NULL){
   [receivedData release];
   receivedData=NULL;
 }
}

 


출처 : http://cafe.naver.com/mcbugi/42519 中 최게바라 답변


+ Recent posts