Top Banner
#Build2016 UWP 응응 응응응응 응응응 응응응 networking APIs 응응응응 Sidharth Nabar, Himadri Sarkar Windows Networking team
35

UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

Jan 17, 2017

Download

Software

Woongjae Lee
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

#Build2016

UWP 응용 프로그램 작성시올바른 networking APIs 사용하기Sidharth Nabar, Himadri SarkarWindows Networking team

Page 2: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

Vtouch Inc. Sofrware Engineering Lab.

[email protected]@vtouch.kr

한글화 작업

Page 3: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

Server-side 지원 시나리오 요구사항Foreground

vs backgroun

d이식성성능 코드 작성의 편의성

네트워킹이 필요한 응용 프로그램을작성시 고려해야할 사항

어떤 API 를 사용할 것인가 ?

Page 4: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

네가지 네트워킹 시나리오와각각의 API 선택 방법에 관한 논의여기서 다룰 내용

사용자 인증된 HTTPS 프로토콜디바이스 – 클라우드의 양방향 통신소켓을 통한 디바이스 간의 통신백그라운드에서 클라우드로부터 컨텐츠를 다운로드 / 업로드

Page 5: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

사용자 인증된HTTPS 프로토콜

시나리오 1

Page 6: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

• 클라이언트에서 인증• Username / Password 으로 할 것인가 , 인증서로 할 것인가 ?• UI 로 할 것인가 , 프로그래밍적으로 할 것인가 ?

• 서버에서 인증• Verisign 같은 잘 알려진 인증기관을 통해서 인증 할 것인가 , 자체 서명 인증서를 통해 인증할 것인가 ?• 서버 인증서 사용자 정의 유효성 검사를 할 것인가 , 특정 기관 인증서 고정 방식

(Certificate pinning) 을 할 것인가 ?

Features

추천 API: HttpClient

Page 7: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

Windows.Web.Http & System.Net.HttpAPI 선택

Feature Windows.Web.Http

System.Net.Http

지원되는 프로그래밍 언어 UWP 지원 언어 전체C++, C# / VB,

Javascript

C# / VB

사설 인증기관 / 자체 서명 인증서 √ √서버 인증서 사용자 정의 유효성 검사 √ ( 새로 추가 ) X ( 로드맵에 있음 )

인증에 대한 기본 UI 포함여부 √ X

클라이언트에서의 인증 지원 여부 √ 부분적으로 지원크로스플랫폼 지원 ( Xamarin ) 여부 X √

Page 8: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

프로그래밍 방식 – Windows.Web.Http1. HttpBaseProtocolFilter 인스턴스를 생성한다 . (optional)

var filter = new HttpBaseProtocolFilter();

2. 생성한 filter 인스턴스에 대한 설정을 수정한다 . (optional)filter.ClientCertificate = myCertificate;

3. HttpClient 인스턴스를 생성한다 . var client = new HttpClient(); ORvar client = new HttpClient(filter);

4. 클라이언트에서 requests 를 보낸다 .HttpResponseMessage response = await client.GetAsync(uri);

Page 9: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

데모 : 온라인 경매 앱요구사항 :1. 서버 인증서 사용자 정의 유효성 검사2. 클라이언트에서 인증API 선택 :Windows.Web.Http.HttpClient

Page 10: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

요약 : 사용자 인증된 HTTPS 프로토콜• Windows.Web.Http

HTTP 보안 및 인증 기능에 대해 많은것을 지원합니다 .모든 UWP 프로그래밍 언어에서 사용 가능합니다 .

• System.Net.Http 자격 증명 및 인증서 사용에 대한 프로그래밍을 지원합니다 .C# / VB 개발자들을 위한 크로스 플랫폼 (Xamarin) 에서 사용 가능합니다 .

( 더 많은 정보와 코드를 보고 싶다면 -> http://aka.ms/httpclientblogpost)

Page 11: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

디바이스 – 클라우드의 양방향 통신

시나리오 2

Page 12: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

• 통신 모델• 진정한 양방향 통신 모델인가 , 클라이언트 – 시작 모델인가 ?• 반이중 통신으로 할 것인가 , 전이중 통신으로 할 것인가 ?

• 서버 엔드포인트• REST API 인가 , 간단한 메시지 교환인가 ?• 웹소켓을 지원할 것인가 ?

• 성능 요구사항 / 최적화• 캐싱 / 데이터 압축을 요구되는가 ?• 지연 / 대기 정도에 대한 요구사항이 있는가 ?

Features

Page 13: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

Windows.Web.Http.HttpClient&Windows.Networking.Sockets.WebSockets

API 선택 (1)

Feature HttpClient WebSockets

메시징 패턴 요청 - 응답 양방향이중 통신 타입 반이중 통신 전이중 통신지연 / 과부화 높다 낮다프록시 / 방화벽 통과 √ √서버 인증서 사용자 정의 유효성 검사 √ ( 새로 추가 ) √ ( 새로 추가 )

REST 지원 , CRUD 사용 기본 내장 추가적인 코드 필요캐싱과 데이터 압축 기본 내장 추가적인 코드 필요

Page 14: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

MessageWebSocket & StreamWebSocket

API 선택 (2)

Feature MessageWebSocket

StreamWebSocket

메세지 포멧 각각 분리된 메시지 이어진 스트림 형식UTF-8 문자열 / JSON 데이터 √ X

바이너리 데이터 √ √

권장하는 데이터 사이즈 Small (bytes/KB) Large (MB)

권장하는 컨텐츠 종류 Strings, JSON content

Audio, Video, Photos

Page 15: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

프로그래밍 방식 – MessageWebSocket1. WebSocket 인스턴스를 생성한다 . var socket= new

MessageWebSocket();

2. socket.MessageReceived 에 이벤트 핸들러를 등록한다 .socket.MessageReceived = myReceivingHandler;

3. socket.Closed 에 이벤트 핸들러를 등록한다 .socket.Closed = myClosedHandler;

4. 서버에 연결하고 , 데이터를 보낸다 . 마지막에 status code 를 받으며 , 연결을 닫는다 .

await socket.ConnectAsync(serverUri);// Send data.socket.Close(code, reason);

Page 16: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

데모 : 온라인 경매 앱요구사항 :1. 클라이언트 – 서버간 양방향 통신2. 서버는 한 클라이언트의 입찰과 관계없이 다른 여러 클라이언트의 입찰을 연결한다 . ( 클라이언트가 개별적으로 연결되어 동작한다 .)3. 지연과 과부하를 최소화한다 .

API 선택 :Windows.Networking.Sockets.MessageWebSocket

Page 17: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

네트워크 트래픽 비교

Wireshark trace for WebSocket run

Wireshark trace for HttpClient runBytes on the wire

Page 18: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

요약 : 디바이스 – 클라우드의 양방향 통신• HttpClient

request - response 통신에 적합하다 .REST API 와 메세지 핸들링 기능 (CRUD) 을 내장하여 지원한다 .

• WebSockets 낮은 지연 양방향 통신에 적합하다 .상단에 메세지 형식과 메세지 핸들링에 대한 정의는 구현될 필요가 있다 .

Page 19: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

소켓을 통한디바이스 간의 통신시나리오 3

Page 20: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

• 소켓의 사용 범위• Foreground 만 사용될 것인가 , Background 에서도 같이 사용될 것인가 ?

• 언어 선택• C# / VB, JavaScript or C++

• 기존 코드• Win32 인가 , .NET 라이브러리인가 ?

Features

Page 21: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

API 선택Feature Windows.Networking.

SocketsSystem.Net.Sockets

WinSock

지원 언어 C++/CX √ X √JavaScript

√ X X

C#/VB √ √ XBackground 활성화 지원 √ X X

Windows.Networking.Sockets, System.Net.Sockets and Winsock

Page 22: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

•백그라운드 작업에서 소켓의 수신 대기를 하기 위한 특별한 트리거 – SocketActivityTrigger•일시 정지상태에서 앱은 소켓의 소유권을 OS 로 이전할 수 있다 .

•OS 는 앱이 실행되지 않을때 조차도 소켓을 살아있게 유지한다 .

백그라운드에서 소켓 수신 대기

Page 23: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

프로그래밍 방식 – Sockets in Background (1)1. 트리거 형식의 태스크인 SocketActivityTrigger 를 생성한다 .

socketTaskBuilder.TaskEntryPoint = "SocketActivityBackgroundTask.SocketActivityTask";var trigger = new SocketActivityTrigger();socketTaskBuilder.SetTrigger(trigger);var task = socketTaskBuilder.Register();

2. 그 태스크에 소켓을 연결하고 , 다른 디바이스에 접속한다 .socket.EnableTransferOwnership(task.TaskId, SocketActivityConnectedStandbyAction.Wake); await socket.ConnectAsync(target, port);

Page 24: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

유의사항 :• 어떤 시점에서도 , 소켓의 소유권은 한 컴포넌트에만 있을 수 있다 .• 사용하는 서비스에 소유된 소켓의 목록을 찾는 방법 :

SocketActivityInformation.AllSockets• 소켓이 리스트에 없다는 것은 이미 닫히거나 회수되었다는 의미이다 .

(msdn : SocketActivityInfomation.AllSockets = Gets a list of all the sockets transferred to the socket brokering service by this app.)

프로그래밍 방식 – Sockets in Background (2)3. 1) Foreground 앱을 일시 정지하거나 , 2) Background 태스크를 취소 ( 다시 Foreground 상태로 이동 ) 했을 때 소유권을 이전한다 .

socket.TransferOwnership(socketId);

Page 25: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

데모 : 멀티 플레이 게임요구사항 :1. 소켓을 통한 디바이스 간의 커뮤니케이션2. 앱이 실행되지 않을 때에도 소켓은 수신 대기 상태여야 한다 .

API 선택 :Windows.Networking.Sockets

Page 26: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

• UWP 에서의 소켓 API권장하는 방법 : Windows.Networking.Sockets다른 가능한 방법 : System.Net.Socket, Winsock

• Background 에서의 소켓 수신 대기SocketActivityTrigger 사용

요약

Page 27: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

백그라운드에서 클라우드로부터 컨텐츠를 다운로드 / 업로드

시나리오 4

Page 28: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

• 프로토콜• HTTP / FTP

• 저장 장소• Memory / File

• 컨텐츠 크기• Small (in KBs)/Big (in MBs)

• 시스템 재시작과 네트워크 중단에 대한 유연성• 디바이스 리소스에 대한 인지 여부• 배터리 / 네트워크 사용량

Features

Page 29: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

HttpClient ( 백그라운드 태스크 ) & BackgroundTransfer

API 선택Feature HttpClient in BG Task Windows.Netwo

rking.BackgroundTransfer

프로토콜 HTTP HTTP/FTP

저장 장소 In memory & File File only

권장하는 파일 크기 Small (KBs) Large (MBs)

유연성 ( 네트워크 연결 중단 / 시스템 재시작 )

추가적인 코드 필요 중단된 지점에서 재시작 가능

네트워크 비용 인지 여부 추가적인 코드 필요 기본 내장배터리 절약 인지 여부 추가적인 코드 필요 기본 내장

Page 30: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

프로그래밍 방식 - Windows.Networking.BackgroundTransfer (1)1. DownloadOperation 인스턴스를 생성한다 .

BackgroundDownloader downloader = new BackgroundDownloader(); DownloadOperation download = downloader.CreateDownload(new Uri(downloadlocation), file);

2. 전송 태스크를 시작한다 . Task<DownloadOperation> startTask = download.StartAsync().AsTask();

3. 전송 태스크를 되찾아 연결한다 .

downloads = await BackgroundDownloader.GetCurrentDownloadsAsync();await download.AttachAsync().AsTask(cts.Token, progressCallback);

Page 31: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

프로그래밍 방식 – Windows.Networking.BackgroundTransfer (2)4. foreground 앱에 완료 이벤트 핸들러를 연결한다 .

Task<DownloadOperation> startTask = download.StartAsync().AsTask();Task continueTask = startTask.ContinueWith(OnDownloadCompleted);

5. background 태스크에서 사용할 완료 이벤트 핸들러를 연결한다 .BackgroundTransferCompletionGroup completionGroup = new BackgroundTransferCompletionGroup();//Create background task builderbuilder.SetTrigger(completionGroup.Trigger);BackgroundDownloader downloader = new BackgroundDownloader(completionGroup);

Page 32: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

데모 : 멀티 플레이 게임요구사항 :1. 백그라운드에서 새로운 게임 레벨을 다운로드한다 .2. 다운로드가 완료되면 , 토스트 알림을 보여준다 .

API 선택 :Windows.Networking.BackgroundTransfer

Page 33: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

• UWP 에서 BackgroundTransfer API큰 파일을 다룰때 권장한다 . 작거나 메모리에 저장할 컨텐츠를 위해서는 – 백그라운드에서 HTTPClient 를 사용한다 .

•자동화된 완료 이벤트 핸들링BackgroundTransferCompletionGroup 에서 트리거를 이용한다 .

요약 – 백그라운드에서 클라우드로부터 컨텐츠를 다운로드 / 업로드

Page 34: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

• MSDN: http://aka.ms/NetworkApiChoice• GitHub Universal Samples:

https://github.com/Microsoft/Windows-universal-samples/• HttpClient• WebSockets• SocketActivityStreamSocket• BackgroundTransfer

• API Feedback: http://aka.ms/WinDevUserVoice

참조와 추가 자료

Page 35: UWP 응용 프로그램 작성시 올바른 networking APIs 사용하기

© 2016 Microsoft Corporation. All rights reserved.

감사합니다 !