Notice»

Recent Post»

Recent Comment»

Recent Trackback»

Archive»

« 2024/4 »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

 
 

2. HttpClient

 

웹서비스와 통신을 위해서는System.Net.Http네임스페이스의 HttpClient를 사용하면 된다. 일반 웹페이지나 Restful 같은 웹서비스에도 사용되며 공공 API나 소셜 기능을 연동할 때 사용할 수 있다. 이번에는 예제를 통해 뉴스 사이트의 RSS(XML)을 가져오는 방법을 알아보도록 한다.

 

[예제 4] HttpClient

HttpClient httpClient;

 

 protected override void OnNavigatedTo(NavigationEventArgs e)

 {

     txtURL.Text = "http://www.yonhapnews.co.kr/RSS/sokbo.xml";

 

     httpClient = new HttpClient();

 }

 

 protected override void OnNavigatedFrom(NavigationEventArgs e)

 {

     if (httpClient != null)

     {

         httpClient.Dispose();

         httpClient = null;

     }

 }

 

 private async void BtnStart_Click(object sender, RoutedEventArgs e)

 {

     txtOutput.Text = string.Empty;

 

     Uri resourceUri;

     if (!Uri.TryCreate(txtURL.Text.Trim(), UriKind.Absolute, out resourceUri))

     {

         txtOutput.Text = "잘못된 URI입니다.";

         return;

     }

    

     try

     {

         HttpResponseMessage response = await httpClient.GetAsync(resourceUri);

 

         // 결과 출력

         txtOutput.Text = ((int)response.StatusCode) + " " + response.ReasonPhrase + ronment.NewLine;

         string responseBodyAsText = await response.Content.ReadAsStringAsync();

         responseBodyAsText = responseBodyAsText.Replace("<br>", Environment.NewLine);

         txtOutput.Text += responseBodyAsText;

     }

     catch (HttpRequestException hre)

     {

         txtOutput.Text = hre.ToString();

     }

     catch (Exception ex)

     {

         txtOutput.Text = ex.ToString();

     }

 }

 

 

 

<그림3> HttpClient 결과

 

몇가지 간단한 에러처리와 결과물 출력시 보기 좋게 하는 코드가 포함되어 있으며 실제 코드는 간단한 편이다. HttpClient클래스를 생성하고GetAsync를 호출하여 반환된 HttpResponseMessage로 결과를 화면에 출력하였다.

HttpClient 클래스는 HTTP를 통해 기본 요청을 보내고 받는데 사용된다. HTTP 요청을 보내고 URI로 식별된 리소스에서 HTTP 응답을 받기 위해 기본 제공되는 클래스를 이용하여 GET,PUT,POST,DELETE 및 기타 요청을 웹 서비스로 보낼 수 있다. HttpClient클래스를 이용하면 https로 시작하는 암호화 사이트도 처리할 수 있으며 오버플로우를 막기 위한 버퍼의 사이즈 제한 또한 손쉽게 처리 할 수 있다.

HttpResponseMessage 클래스는 HTTP 요청에서 받은 HTTP 응답 메시지를 나타낸다. HttpContent 클래스는 HTTP 엔티티 본문과 콘텐츠 헤더를 나타내는 기본 클래스이다.

Async 네이밍과 await 키워드는 앞서 비동기에서 설명하였으며 네트워크는 그 특성상 완료되는 시점을 알 수 없으므로 대부분이 비동기로 처리되어 있을 것이다.

 

:

13년 6월 1일 ~ 2일(16시간)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

:

13년 5월 24일 ~ 25일(16시간)

 

 

 

 

 

 

 

 

 

:

13년 5월 4일 ~ 5일(16시간)

 

5월 10~11일 여성개발자 핑크 해커톤을 위한 사전 교육

 

 

 

 

 

 

 

 

 

:

장소 : 대치동 포스코센터 서관 5 Agility

일시 : 4 23 () 09:30~18:00

 

윈도우8 기본 개발 교육 및 미디어플레이 관련 교육

 

http://visualstudiogallery.msdn.microsoft.com/e02ccac7-f3eb-4b53-b11a-c657d5631483

http://visualstudiogallery.msdn.microsoft.com/04423d13-3b3e-4741-a01c-1ae29e84fea6

 

:

 

 

 

:

 12년 12월 20일 ~ 21일(16시간)

 

 

 

 

:

Windows8 PushNotification & Azure Mobile Service 교육

12년 12월 17일

한국디지털미디어고등학교

 

Windows8 PushNotification

Azure Mobile Service

 

 

 

:

Windows8 MAAP Program 

LGCNS

9월 10일~10월 25일

 

1차 윈도우8 기업적용 시나리오 및 개발 관련

30명 참여

 

2차 윈도우8 기획, 개발, 디자인적용한 앱 개발

LGCNS 참여 인원 5명(개발 및 디자인)

 

한국MS, LG CNS 윈도우8 도입사례 소개…"기존 인프라 활용 비용절감 효과"

http://m.news.naver.com/read.nhn?mode=LSD&mid=sec&sid1=105&oid=029&aid=0002139360

:

윈도우8 네트워크 정보

프로그래밍/Windows 10 | 2013. 6. 19. 09:11 | Posted by 99%

1. 네트워크 정보

 

윈도우8앱에서 네트워크를 사용할 경우에는 연결된 네트워크 상태를 확인할 필요가 있다. 데이터가 큰 경우나 실시간으로 데이터를 주고 받을 때는 Background Task를 사용하겠지만 사용한다고 해도 실제 앱에서 체크하여 사용자에게 상태를 알려주거나 관련 처리를 해야 할 경우가 있다. 또한 윈도우8앱은 기본적으로 윈도우 스토어에서 배포하게 되는데 윈도우 스토어  뿐만 아니라 사용자에게 서비스되는 거의 모든 스토어에서는 네트워크를 사용하는 앱에서 사용자에게 네트워크 정보 및 상태를 알리게 가이드 하고 있다.

네트워크 관련 정보에는 현재 연결된 네트워크 정보(Wi-Fi, 3G), 사용시간 정보, 네트워크 장비 정보, 사용 요금 등이 있으며 윈도우8에서는 관련 정보를 Windows.NetworkInformation을 통해 제공한다. 연결된 네트워크 정보는ConnectionProfile을 통해 알 수 있다.

 

[예제 1] 네트워크 정보

private void BtnInternetConnection_Click(object sender, RoutedEventArgs e)

{

    string connectionProfileInfo = string.Empty;

    try

    {

        ConnectionProfile InternetConnectionProfile = NetworkInformation.GetInternetConnectionProfile();

 

        if (InternetConnectionProfile == null)

        {

            txtNetProfile.Text = "인터넷에 연결되지 않음.\n";

        }

        else

        {

            txtNetProfile.Text = GetConnectionProfile(InternetConnectionProfile);

        }

    }

    catch (Exception ex)

    {

        txtNetProfile.Text = "예외 발생: " + ex.ToString();

    }

}

 

private void BtnConnections_Click(object sender, RoutedEventArgs e)

{

    string connectionProfileList = string.Empty;

    try

    {

        IReadOnlyList<ConnectionProfile> ConnectionProfiles = NetworkInformation.GetConnectionProfiles();

        foreach (ConnectionProfile connectionProfile in ConnectionProfiles)

        {

            connectionProfileList += GetConnectionProfile(connectionProfile);

            connectionProfileList += "-----------------------------------------------------\n\n";

        }

        txtNetProfile.Text = connectionProfileList;

    }

    catch (Exception ex)

    {

        txtNetProfile.Text = "예외 발생: " + ex.ToString();

    }

}

 

string GetConnectionProfile(ConnectionProfile connectionProfile)

{

    string connectionProfileInfo = string.Empty;

    if (connectionProfile != null)

    {

        connectionProfileInfo = "Profile Name : " + connectionProfile.ProfileName + "\n";

 

        switch (connectionProfile.GetNetworkConnectivityLevel())

        {

            case NetworkConnectivityLevel.None:

                connectionProfileInfo += "Connectivity Level : None\n";

                break;

            case NetworkConnectivityLevel.LocalAccess:

                connectionProfileInfo += "Connectivity Level : Local Access\n";

                break;

            case NetworkConnectivityLevel.ConstrainedInternetAccess:

                connectionProfileInfo += "Connectivity Level : Constrained Internet Access\n";

                break;

            case NetworkConnectivityLevel.InternetAccess:

                connectionProfileInfo += "Connectivity Level : Internet Access\n";

                break;

        }

    }

    return connectionProfileInfo;

}

 

예제 1는 현재 사용중인 대표 네트워크 정보와 모든 네트워크 정보를 가져오는 두개의 버튼이 추가되어 있으며 현재 인터넷을 사용중인 네트워크 정보를 NetworkInformation.GetInternetConnectionProfile를 통해ConnectionProfile로 얻어 왔다.

리턴된 값이 null이면 연결된 네트워크 정보가 없으며 null이 아니면 ConnectionProfileGetConnectionProfile라는 함수를 통해 정보를 출력해주고 있다. 정보에는ProfileName이라는 네트워크 프로필 이름이 있으며 무선 네트워크 이름과 같고 GetNetworkConnectivityLevel를 통해 현재 사용중인 네트워크의 인터넷 엑세스 정보를 알 수 있다. 그 리턴 값은NetworkConnectivityLevel 열거형으로 되어 있으며InternetAccess은 인터넷 엑세스가 가능하고 LocalAccess은 인터넷이 안되는 로컬망이고ConstrainedInternetAccess은 제한적인 인터넷 엑세스를 나타낸다.

 

<그림1> GetInternetConnectionProfile 결과

 

 <그림2> GetConnectionProfiles 결과

 

NetworkInformation.GetInternetConnectionProfile는 현재 사용중인 대표적인 네트워크 정보만을 나타내므로 한 개의 네트워크 정보만을 반환하지만NetworkInformation.GetConnectionProfiles를 이용하면 모든 네트워크 정보를 IReadOnlyList<ConnectionProfile>로 반환해준다. 이전 사용했던 무선 네트워크 정보도 포함되며 다수의 정보가 포함됐을 뿐 각각의 정보는ConnectionProfile을 통해 제공되므로 사용법은 같다.

 

ConnectionProfile에는 네트워크 사용량 및 데이터 요금제 상태 정보도 포함되어 있으며 관련  정보는 아래와 같다.

 

< 1> 네트워크 사용량 및 데이터 요금제 상태 정보

데이터

제공 요소

설명

연결 비용

ConnectionCost

데이터 제한 및 로밍 정보를 포함하여 연결 비용 정보에 대한 자세한 정보

비용 유형

NetworkCostType

현재 사용하는 네트워크의 비용 유형

데이터 요금제 상태 및 사용량

DataPlanStatus,
DataPlanUsage

데이터 요금제에 대한 사용량 정보

데이터 사용량

DataUsage

데이터 사용량 정보

네트워크 어댑터

NetworkAdapter

네트워크 어댑터를 식별

 

연결 비용은 ConnectionProfileGetConnectionCost를 통해 얻을 수 있고 NetworkCostType을 통해 비용 유형을 알 수 있다. 데이터 요금제 상태 및 네트워크 사용량은 GetDataPlanStatusGetLocalUsage를 통해 확인 할 수 있다. 또한 NetworkAdapter로 네트워크 어댑터정보를 얻어 올 수 있다.

 

윈도우8은 태블릿에서 이동통신망도 사용하므로 앱에서 사용된 데이터 사용량을 확인 할 필요가 있다. 예제를 통해 알아보자.

 

[예제 2] 네트워크 사용량

string localDataUsage = string.Empty;

 DateTime CurrTime = DateTime.Now;

 TimeSpan TimeDiff = new TimeSpan(1, 0, 0);

 

 try

 {

     ConnectionProfile InternetConnectionProfile = NetworkInformation.GetInternetConnectionProfile();

 

     if (InternetConnectionProfile == null)

     {

         txtNetProfile.Text = "인터넷에 연결되지 않음.\n";

     }

     else

     {

         DataUsage LocalUsage = InternetConnectionProfile.GetLocalUsage(CurrTime.Subtract(TimeDiff), me);

 

         localDataUsage = "Local Data Usage:\n";

         localDataUsage += " Bytes Sent     : " + LocalUsage.BytesSent + "\n";

         localDataUsage += " Bytes Received : " + LocalUsage.BytesReceived + "\n";

         txtNetProfile.Text = localDataUsage;

     }

 }

 catch (Exception ex)

 {

     txtNetProfile.Text = "예외 발생: " + ex.ToString();

 }

 

현재 사용중인 네트워크 정보인 ConnectionProfileGetLocalUsage를 통해 DataUsage를 얻어왔다. GetLocalUsage로 데이터를 얻어 올 때 1시간전까지의 데이터를 가져왔으며 BytesSentBytesReceived로 네트워크의 사용량을 확인 할 수 있다.

위 예제들을 이용하면 현재 네트워크의 접속 유무 및 접속된 네트워크의 정보를 가져올 수 있지만 실시간으로 정보를 전달 받기 위해서는NetworkInformation.NetworkStatusChanged를 이용해서 이벤트 핸들러를 등록하면 된다.

 

[예제 3] 네트워크 상태 확인

public static bool registeredNetworkStatusNotif = false;

string internetProfileInfo = string.Empty;

NetworkStatusChangedEventHandler networkStatusCallback = null;

private CoreDispatcher _cd = Window.Current.CoreWindow.Dispatcher;

 

private void BtnNetStatus_Click(object sender, RoutedEventArgs e)

{

    try

    {

        networkStatusCallback = new NetworkStatusChangedEventHandler(OnNetworkStatusChange);

        if (!registeredNetworkStatusNotif)

        {

            NetworkInformation.NetworkStatusChanged += networkStatusCallback;

            registeredNetworkStatusNotif = true;

        }

        if (internetProfileInfo == "")

        {

            txtNetProfile.Text = "네트워크 상태 변경 사항 없음.";

        }

        else

        {

            txtNetProfile.Text = internetProfileInfo;

        }

    }

    catch (Exception ex)

    {

        txtNetProfile.Text = "예외 발생: " + ex.ToString();

    }

}

 

async void OnNetworkStatusChange(object sender)

{

    string connectionProfileInfo = string.Empty;

 

    internetProfileInfo = "네트워크 상태가 변경됨.: \n\r";

 

    try

    {          

        ConnectionProfile InternetConnectionProfile = workInformation.GetInternetConnectionProfile();

 

        if (InternetConnectionProfile == null)

        {

            await _cd.RunAsync(CoreDispatcherPriority.Normal, () =>

            {

                txtNetProfile.Text = "인터넷에 연결되지 않음.\n";

            });

        }

        else

        {

            connectionProfileInfo = GetConnectionProfile(InternetConnectionProfile);

            await _cd.RunAsync(CoreDispatcherPriority.Normal, () =>

            {

                txtNetProfile.Text = connectionProfileInfo;

            });

        }

        internetProfileInfo = "";

    }

    catch (Exception ex)

    {

        txtNetProfile.Text = ("예외 발생: " + ex.ToString());

    }

}

 

void UnRegisterForNetworkStatusChangeNotif()

{

    NetworkInformation.NetworkStatusChanged -= networkStatusCallback;

    internetProfileInfo = "";

    registeredNetworkStatusNotif = false;

}

 

NetworkInformation.NetworkStatusChanged에 이벤트 핸들러를 등록하여 변화된 상태를 전달 받으며ConnectionProfile를 이용해 상태값을 확인한다. 네트워크 상태 확인을 완료하고 싶거나 앱 종료시는UnRegisterForNetworkStatusChangeNotif와 같이 등록된 핸들러를 제거해주면 된다.

 

: