Socket 클래스를 이용한 TCP/IP 통신
TCP/IP with socket class
Socket 클래스를 이용한 TCP/IP 통신
C# Socket 클래스를 이용한 TCP 통신
Socket
클래스는 .NET 에서 제공하는 저수준 네트워크 통신 API입니다.
TcpClient
, TcpListener
보다 복잡하지만, 더 세밀하게 통신을 제어할 수 있다는 장점이 있습니다.
이번 글에서는 C#에서 Socekt
클래스를 직접 사용하여 TCP 서버/클라이언트를 구현해보겠습니다.
1. TCP 서버 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class TcpServer
{
static void Main()
{
// 1. 소켓 생성 (IPv4, TCP, 스트림 타입)
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 2. 포트 바인딩 및 리스닝
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 9000));
serverSocket.Listen(5);
Console.WriteLine("서버 시작됨. 클라이언트 기다리는 중...");
// 3. 클라이언트 수신 대기
Socket clientSocket = serverSocket.Accept();
Console.WriteLine("클라이언트 연결됨");
// 4. 데이터 수신
byte[] buffer = new byte[1024];
int received = clientSocket.Receive(buffer);
string message = Encoding.UTF8.GetString(buffer, 0, received);
Console.WriteLine("수신 메시지: " + message);
// 5. 응답 전송
string response = "서버 응답: " + message.ToUpper();
byte[] responseData = Encoding.UTF8.GetBytes(response);
clientSocket.Send(responseData);
// 6. 연결 종료
clientSocket.Close();
serverSocket.Close();
}
}
2. TCP 클라이언트 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class TcpClient
{
static void Main()
{
// 1. 서버 접속
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect("127.0.0.1", 9000);
// 2. 메시지 전송
string message = "안녕하세요 서버님!";
byte[] data = Encoding.UTF8.GetBytes(message);
socket.Send(data);
// 3. 서버 응답 수신
byte[] buffer = new byte[1024];
int received = socket.Receive(buffer);
string response = Encoding.UTF8.GetString(buffer, 0, received);
Console.WriteLine("서버 응답: " + response);
// 4. 종료
socket.Close();
}
}
포인트 요약
Socket
은 TCP/UDP 모두 지원하며, 다양한 설정이 가능하다.- 수신 버퍼 크기, SendTimeout, KeepAlive 등 설정을 직접 할 수 있다.
- 단점은 코드가 길고, 초보자에게 진입 장벽이 있을 수 있음.
주의할 점
- 클라이언트가
Send()
를 하면 서버에서 반드시Receive()
가 있어야함. - UTF-8 인코딩을 사용하지 않으면 한글이 깨질 수 있음.
Socket.Close()
호출 안 하면 포트가 남아서 다음 실행에 방해될 수 있음.
마무리
Socket
클래스를 사용하면 네트워크 통신의 기초부터 확장까지 자유롭게 구현할 수 있습니다.
다만, 비동기 처리나 멀티 클라이언트 처리는 이보다 더 복잡해지기 때문에
다음 포스팅에서는 더 간단하게 구현할 수 있는 TcpClient
, TcpListener
클래스를 소개하겠습니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.