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

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

Upload: woongjae-lee

Post on 17-Jan-2017

472 views

Category:

Software


8 download

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.

감사합니다 !