728x90
반응형
TcpListener 사용법
.NET Framework에서 TCP 서버 프로그램을 개발하기 위해서는 System.Net.Sokets.TcoListener 클래스를 사용한다 TcpListener 클래스는 내부적으로 System.Net.Sockets.Soket 클래스 기능들을 사용하여 TCP Port Listening 기능을 구현하고 있다 TCP 서버는 TcpListener 클래스를 통해 포트를 열고
Tcp Listener.AcceptTcpClient() 메서드를 통해 클라이언트 접속을 대기하고 있다가 접속 요청이 오면 이를 받아들여 TcpClient 객체를 생성하여 리턴 한다 이후 서버의 TcpClient 객체가 클라이언트와 직접 네트워크 스트림을 통해 통신하게 된다
using System.Net.Sockets;
using System.Net;
namespace TCP_Server_test
{
internal class Program
{
static void Main(string[] args)
{
// 로컬 포트 8080을 Listen
TcpListener listener = new TcpListener(IPAddress.Any, 8080);
listener.Start();
byte[] buffer = new byte[1024];
while (true)
{
// TcpClient Connection 요청을 받아들여
// 서버에서 새 TcpClient 객체를 생성하여 리턴
TcpClient client = listener.AcceptTcpClient();
// TcpClient 객체에서 NetworkStream을 얻어옴
NetworkStream stream = client.GetStream();
// 클라이언트가 연결을 끊을 떄까지 데이터 수신
int nbytes;
while ((nbytes = stream.Read(buffer, 0, buffer.Length)) > 0) {
// 데이터 그대로 송신
stream.Write(buffer, 0, nbytes);
}
// 스트림과 TcpClient 객체
stream.Close();
client.Close();
//계속 반복
}
}
}
}
위 예제를 살펴보겠다
- TCP 서버에서 포트를 열고 Listening 하기 위해 TcpListener 생성자에 IPAddress 와 포트 번호를 지정 한다 여기서 IPAddress.Any는 0.0.0.0를 가리키는 것으로 로컬 머신의 모든 IP IPAddress에 대해 Listening 할 경우 사용한다 TcpListener 객체 생성 후 실제 Listening을 시작하기 위해 Start() 메서드를 호출 한다
- Listening을 시작한 후 일반적으로 무한 루프를 만들어 서버가 계속 클라이언트 연결 요청을 처리하도록 한다 루프 안에서 TcpListener 객체의 AccepTcpClient() 메서드를 사용하면 TcpClient Connection 요청이 올 때까지 대기했다가 요청이 들어오면 요청을 수용하고 서버에서 새 TcpClient 객체를 생성하여 리턴 한다 이렇게 생성된 TcpClient 객체를 통해 클라이언트와 통신 하게 된다 위 예제는 동기 적으로 클라이언트 요청을 하나 씩 처리하는 예이다
- TcpClient 객체의 GetStream() 메서드는 TCP 네트워크 스트 림을 리턴 한다 이 네트워크 스트림을 이용해서 네트워크로 데이터 송 수신 하게 된다
- NetworkStream의 Read() 메서드를 사용하여 클라이언트 데이터를 읽어온다 여기서 Echo 서버 예제는 클라이언트가 Connection을 끊을 때까지 서버는 계속 읽는다는 프로토콜을 구현한 것이다
- NetworkStream 의 Write() 메서드를 사용하여 데이터를 클라이언트에 보낸다
- 마지막으로 NetworkStreamNetworkStream 을 닫고 TcpClient 객체를 닫는다
728x90
반응형
'개인 스터디' 카테고리의 다른 글
C# Thread(스레드) 주요 속성과 메서드 (0) | 2024.10.15 |
---|---|
무명 메서드 (Anonymous Method) (0) | 2024.10.14 |
TCP 클라이언트 (0) | 2024.10.11 |
Win Sock 과 .NET 클래스 (1) | 2024.10.11 |
시리얼 통신 (0) | 2024.10.10 |