목록c# (27)
Coding Memo
흐름 제어란? 발신자가 수신자가 처리할 수 있는 것보다 더 빨리, 많이 데이터를 보낼 경우에 수신자는 일부 데이터(패킷)에 대해 삭제가 되거나 손실이 발생 할 수 있다. 이 문제를 방지하기 위해 TCP 연결에서는 흐름제어를 사용한다. 흐름제어(flow-control)는 수신자의 상태를 보고 전송을 제어하여 데이터의 손실이나 정체 없이 효율적이고 안정적으로 통신을 가능하게 한다. 예를 들어, 수신자가 100바이트의 버퍼를 가지고 있는데, 발신자가 150바이트의 데이터를 보냈다고 가정하자. TCP 연결에서 발신자는 수신자가 처리 할 수 있는 데이터의 양 (Sliding Window)을 미리 정한다. 따라서 발신자는 먼저 100바이트를 송신하고, 수신자가 먼저 100바이트를 받고 처리 후, 발신자에게 추가 데..
[요약] SocketAsyncEventArgs.BufferList을 통해 데이터를 전송 할 때, 반드시 새로운 리스트를 만들고 바이트 데이터를 그 리스트에 추가(Add)를 한 후에 그 리스트를 SocketAsyncEventArgs.BufferList에 직접 할당해야만 한다!! (이 관련 내용은 공식적으로 문서화 되어있지 않다고 한다.) 1. 리스트 생성 (IList) 2. 1에서 생성한 리스트에 아이템 추가(Add) 3. SocketAsyncEventArgs.BufferList에 1에서 생성한 리스트 직접 할당 ***SocketAsyncEventArgs.BufferList에 직접 아이템 Add 하지 말자.*** Why? BufferList의 Setter 호출 시, 기존 리스트에 있는 버퍼만 사용하기 때문..
에코 서버? 클라이언트로 부터 들어온 데이터(메세지)를 서버에서 그대로 다시 클라이언트로 전송하는 서버를 말한다. 서버와 클라이언트 설계 TCP 소켓을 이용해 서버와 클라이언트를 먼저 연결한 후에 메시지를 보낸다. 기억해야할 점은 데이터는 byte[] 타입으로 주고받는다는 것이다. 이를 잘 처리해야한다. 공통 1. TCP 소켓을 이용해 데이터를 송수신 2. 메시지 타입은 string, 인코딩 형식은 UTF-8로 통일 3. localhost를 이용하되, 코드를 통해 컴퓨터의 주소를 가져오고 그 첫 번째 주소를 엔드포인트로 사용 (port: 8888) 4. 간단하게 작성하고 테스트하기 위해 blocking 함수로 소켓 프로그래밍 5. 소켓에 대한 에러 확인 및 예외 처리는 생략 서버에서 이뤄져야 할 것들 1..
소켓이란? 네트워크를 통해 두 프로그램이나 프로세스 간의 통신을 위한 끝 점(EndPoint) 이다. 두 프로그램은 이 소켓을 통해 네트워크에서 데이터를 서로 주고 받을 수 있다. IP 주소와 포트 넘버을 소켓에 지정하여 컴퓨터의 주소와 프로그램을 식별할 수 있다. 소켓 생성은 OS에 의해 실행된다. (시스템 호출로 소켓 생성 시, context-switching이 일어난다.) 프로그램이 종료되면, OS에 의해 사용했던 소켓에 할당된 리소스를 해제한다. 자주 사용하는 TCP 타입과 UDP 타입 외에도 다양한 소켓 타입이 있다. 소켓 프로그래밍 소켓 프로그래밍 시에 공통적인 사항이 있다. 1. 소켓 생성 시 소켓 타입, 프로토콜 등을 지정한다. 2. 엔드포인트 (소켓 주소) 생성 시, 호스트(ip주소 등)..
이벤트 버스를 통해 구독자와 게시자가 서로 통신하는 형태의 디자인 패턴으로 게시-구독(Publisher - Subscriber)의 형태로 구현된다. 서로 직접적인 종속성 없이 통신할 수 있도록 지원하는 패턴이다. 컴포넌트가 이벤트 버스에 이벤트를 게시(publish) 후, 다른 컴포넌트가 해당 이벤트를 구독하고 반응 (handle, trigger)하는 것이 핵심 디자인이다. 이벤트 버스 패턴도 관찰자 패턴과 마찬가지로 언어 자체적으로 간접적 지원을 위한 인터페이스를 제공하거나 언어와 관련된 프레임워크에 포함되는 경우가 많다. Java Application Event Publisher (Spring) C# Event-based Asynchronous Pattern (EAP), Event Keyword Ja..
Command 패턴은 어떤 객체를 활용할 때 그 객체를 직접 조작하는 것 대신에, 조작을 어떻게 하라고 명령을 보내는 방식을 사용하는 패턴이다. 조작 방식 명령을 보낼 때, Command라는 인터페이스나 추상 클래스를 포함하도록 캡슐화 하여 중간 매개체인 Invoker는 Command에 대한 구체적인 내용은 알 수 없도록 한다. 요청을 매개변수화, 요청 대기 열, 로깅, 실행 취소 등에 활용 될 수 있는 패턴이다. 커맨드 패턴 Command 요청을 캡슐화 하는 인터페이스나 추상 클래스로 execute를 구현하고 이 요청을 실행할 수신자(receiver)를 가지고 있는 개체 Invoker 작업 수행 명령 수신자에 요청하는 매개체로 클라이언트로부터 받은 실행 명령을 설계된 패턴에 의해 수신자에게 명려을 요청..
Observer 패턴은 Observable 패턴으로 불리기도 한다. Observer 패턴은 개체 간 1:N 종속성을 설정할 때 사용되는 동작(행태) 디자인 패턴이다. Subject의 상태가 변경되면 이 Subject에 등록되어 있는 Observer들에게 통지를 해주어 Observer에서 각각의 처리를 할 수 있도록 알려준다. 개제 간에 느슨한 결합을 형성하며, 몇몇 언어들을 자체적으로 간접적 제공(인터페이스 및 클래스)하는 경우도 있다. 예시 C# System - IObservable, IObserver Java java.util.Observable, java.util.Observer Note: 관찰자 패턴은 UI를 업데이트하는데에도 이용할 수 있다. 특정 값이 변경되었을 때, 변화를 감지하고 UI를 자..
싱글턴 패턴 싱글턴 패턴은 자주 이용되는 디자인 패턴 중 하나이다. 간단하게 정의하자면, 어떤 특정 컴포넌트의 인스턴스가 애플리케이션 전체에 단 하나만 존재해야 하는 상황에서 사용하는 디자인 패턴이다. 싱글턴으로 디자인된 클래스에 인스턴스를 요청하면, 인스턴스를 반환하는 방식이다. 직접 new()를 사용해 인스턴스를 생성하지 않는다는 것을 기억하자. 구현 위 내용을 코드로 구현한다면 (C#, Java) class Singleton { private static Singleton _instance; public static Singleton Instance { get { if (_instance == null) { _instance = new(); return _instance; } return _inst..