TCP 소켓은 상대적으로 UDP의 구현 코드와 비교하면 좀 더 복잡하다. 코드를 직접 살펴보기에 앞서
대략적인 흐름을 먼저 정리해 보자.
우선, 서버소켓의 경우 다음과 같은 생명 주기(lifecycle)를 갖는다.

Bind 단계까지는 UDP 서버 소켓을 사용하는 방법과 유사하다. 단지 Stream 유형의 소켓을 생성한후
TCP 통신을 위한 접점(IP + Port)으로 Bind 메서드를 호출하면 된다.
Socket srvSocket = new Socket(AddressFamily.InterNetwork
, SocketType.Stream
, ProtocolType.Tcp);
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 11200);
srvSocket.Bind(endPoint);
TCP 역시 일단 고유한 접점으로 바인딩되면 같은 운영체제에서 실행되는 어떠한 프로세스도 동일한
정보로 소켓 바인딩을 할 수 없다.
바인딩이 완료된 TCP 서버 소켓은 Listen 메서드를 호출하면서 클라이언트로부터의 접속을 허용한다
srvSocket.Listetn(10);
이때 Listen 메서드에 전달된 숫자값은 클라이언트의 접속을 보관할 수 있는 큐의 길이를 나타낸다.
위에서는 10이라고 지정했으므로 최대 10개의 클라이언트 접속을 큐에 보관할 수 있다. 보관된 클라
이언트 연결을 꺼내는 것은 Accept 메서드를 호출함으로써 가능하다.
Socket clntSocket = srvSocket.Accept();