uwp 응용 프로그램 작성시 올바른 networking apis 사용하기
TRANSCRIPT
#Build2016
UWP 응용 프로그램 작성시올바른 networking APIs 사용하기Sidharth Nabar, Himadri SarkarWindows Networking team
Server-side 지원 시나리오 요구사항Foreground
vs backgroun
d이식성성능 코드 작성의 편의성
네트워킹이 필요한 응용 프로그램을작성시 고려해야할 사항
어떤 API 를 사용할 것인가 ?
네가지 네트워킹 시나리오와각각의 API 선택 방법에 관한 논의여기서 다룰 내용
사용자 인증된 HTTPS 프로토콜디바이스 – 클라우드의 양방향 통신소켓을 통한 디바이스 간의 통신백그라운드에서 클라우드로부터 컨텐츠를 다운로드 / 업로드
사용자 인증된HTTPS 프로토콜
시나리오 1
• 클라이언트에서 인증• Username / Password 으로 할 것인가 , 인증서로 할 것인가 ?• UI 로 할 것인가 , 프로그래밍적으로 할 것인가 ?
• 서버에서 인증• Verisign 같은 잘 알려진 인증기관을 통해서 인증 할 것인가 , 자체 서명 인증서를 통해 인증할 것인가 ?• 서버 인증서 사용자 정의 유효성 검사를 할 것인가 , 특정 기관 인증서 고정 방식
(Certificate pinning) 을 할 것인가 ?
Features
추천 API: HttpClient
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 √
프로그래밍 방식 – 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);
데모 : 온라인 경매 앱요구사항 :1. 서버 인증서 사용자 정의 유효성 검사2. 클라이언트에서 인증API 선택 :Windows.Web.Http.HttpClient
요약 : 사용자 인증된 HTTPS 프로토콜• Windows.Web.Http
HTTP 보안 및 인증 기능에 대해 많은것을 지원합니다 .모든 UWP 프로그래밍 언어에서 사용 가능합니다 .
• System.Net.Http 자격 증명 및 인증서 사용에 대한 프로그래밍을 지원합니다 .C# / VB 개발자들을 위한 크로스 플랫폼 (Xamarin) 에서 사용 가능합니다 .
( 더 많은 정보와 코드를 보고 싶다면 -> http://aka.ms/httpclientblogpost)
디바이스 – 클라우드의 양방향 통신
시나리오 2
• 통신 모델• 진정한 양방향 통신 모델인가 , 클라이언트 – 시작 모델인가 ?• 반이중 통신으로 할 것인가 , 전이중 통신으로 할 것인가 ?
• 서버 엔드포인트• REST API 인가 , 간단한 메시지 교환인가 ?• 웹소켓을 지원할 것인가 ?
• 성능 요구사항 / 최적화• 캐싱 / 데이터 압축을 요구되는가 ?• 지연 / 대기 정도에 대한 요구사항이 있는가 ?
Features
Windows.Web.Http.HttpClient&Windows.Networking.Sockets.WebSockets
API 선택 (1)
Feature HttpClient WebSockets
메시징 패턴 요청 - 응답 양방향이중 통신 타입 반이중 통신 전이중 통신지연 / 과부화 높다 낮다프록시 / 방화벽 통과 √ √서버 인증서 사용자 정의 유효성 검사 √ ( 새로 추가 ) √ ( 새로 추가 )
REST 지원 , CRUD 사용 기본 내장 추가적인 코드 필요캐싱과 데이터 압축 기본 내장 추가적인 코드 필요
MessageWebSocket & StreamWebSocket
API 선택 (2)
Feature MessageWebSocket
StreamWebSocket
메세지 포멧 각각 분리된 메시지 이어진 스트림 형식UTF-8 문자열 / JSON 데이터 √ X
바이너리 데이터 √ √
권장하는 데이터 사이즈 Small (bytes/KB) Large (MB)
권장하는 컨텐츠 종류 Strings, JSON content
Audio, Video, Photos
프로그래밍 방식 – 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);
데모 : 온라인 경매 앱요구사항 :1. 클라이언트 – 서버간 양방향 통신2. 서버는 한 클라이언트의 입찰과 관계없이 다른 여러 클라이언트의 입찰을 연결한다 . ( 클라이언트가 개별적으로 연결되어 동작한다 .)3. 지연과 과부하를 최소화한다 .
API 선택 :Windows.Networking.Sockets.MessageWebSocket
네트워크 트래픽 비교
Wireshark trace for WebSocket run
Wireshark trace for HttpClient runBytes on the wire
요약 : 디바이스 – 클라우드의 양방향 통신• HttpClient
request - response 통신에 적합하다 .REST API 와 메세지 핸들링 기능 (CRUD) 을 내장하여 지원한다 .
• WebSockets 낮은 지연 양방향 통신에 적합하다 .상단에 메세지 형식과 메세지 핸들링에 대한 정의는 구현될 필요가 있다 .
소켓을 통한디바이스 간의 통신시나리오 3
• 소켓의 사용 범위• Foreground 만 사용될 것인가 , Background 에서도 같이 사용될 것인가 ?
• 언어 선택• C# / VB, JavaScript or C++
• 기존 코드• Win32 인가 , .NET 라이브러리인가 ?
Features
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
•백그라운드 작업에서 소켓의 수신 대기를 하기 위한 특별한 트리거 – SocketActivityTrigger•일시 정지상태에서 앱은 소켓의 소유권을 OS 로 이전할 수 있다 .
•OS 는 앱이 실행되지 않을때 조차도 소켓을 살아있게 유지한다 .
백그라운드에서 소켓 수신 대기
프로그래밍 방식 – 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);
유의사항 :• 어떤 시점에서도 , 소켓의 소유권은 한 컴포넌트에만 있을 수 있다 .• 사용하는 서비스에 소유된 소켓의 목록을 찾는 방법 :
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);
데모 : 멀티 플레이 게임요구사항 :1. 소켓을 통한 디바이스 간의 커뮤니케이션2. 앱이 실행되지 않을 때에도 소켓은 수신 대기 상태여야 한다 .
API 선택 :Windows.Networking.Sockets
• UWP 에서의 소켓 API권장하는 방법 : Windows.Networking.Sockets다른 가능한 방법 : System.Net.Socket, Winsock
• Background 에서의 소켓 수신 대기SocketActivityTrigger 사용
요약
백그라운드에서 클라우드로부터 컨텐츠를 다운로드 / 업로드
시나리오 4
• 프로토콜• HTTP / FTP
• 저장 장소• Memory / File
• 컨텐츠 크기• Small (in KBs)/Big (in MBs)
• 시스템 재시작과 네트워크 중단에 대한 유연성• 디바이스 리소스에 대한 인지 여부• 배터리 / 네트워크 사용량
Features
HttpClient ( 백그라운드 태스크 ) & BackgroundTransfer
API 선택Feature HttpClient in BG Task Windows.Netwo
rking.BackgroundTransfer
프로토콜 HTTP HTTP/FTP
저장 장소 In memory & File File only
권장하는 파일 크기 Small (KBs) Large (MBs)
유연성 ( 네트워크 연결 중단 / 시스템 재시작 )
추가적인 코드 필요 중단된 지점에서 재시작 가능
네트워크 비용 인지 여부 추가적인 코드 필요 기본 내장배터리 절약 인지 여부 추가적인 코드 필요 기본 내장
프로그래밍 방식 - 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);
프로그래밍 방식 – 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);
데모 : 멀티 플레이 게임요구사항 :1. 백그라운드에서 새로운 게임 레벨을 다운로드한다 .2. 다운로드가 완료되면 , 토스트 알림을 보여준다 .
API 선택 :Windows.Networking.BackgroundTransfer
• UWP 에서 BackgroundTransfer API큰 파일을 다룰때 권장한다 . 작거나 메모리에 저장할 컨텐츠를 위해서는 – 백그라운드에서 HTTPClient 를 사용한다 .
•자동화된 완료 이벤트 핸들링BackgroundTransferCompletionGroup 에서 트리거를 이용한다 .
요약 – 백그라운드에서 클라우드로부터 컨텐츠를 다운로드 / 업로드
• 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
참조와 추가 자료
© 2016 Microsoft Corporation. All rights reserved.
감사합니다 !