-
소켓 프로그래밍: 네트워크 통신의 기초2024년 03월 19일
- 유니얼
-
작성자
-
2024.03.19.:45
728x90C# 게임 서버 만들기
네트워크 통신의 세계에서 소켓 프로그래밍은 필수적인 개념입니다. 컴퓨터 간에 데이터를 주고받기 위한 매커니즘을 제공하는 소켓은 네트워크 프로그래밍의 핵심 요소입니다. 이 글에서는 소켓 프로그래밍이 무엇인지, 그리고 기본적인 예제 코드를 통해 어떻게 소켓을 사용하여 네트워크 통신을 구현하는지 설명하겠습니다.
참고자료
소켓 프로그래밍이란?
소켓 프로그래밍은 네트워크 상에서 서로 다른 시스템 간에 데이터를 주고받기 위해 사용하는 프로그래밍 기법입니다. 소켓은 네트워크 통신의 끝점(endpoint)을 의미하며, IP 주소와 포트 번호의 조합으로 식별됩니다. 소켓을 사용하면, 애플리케이션은 네트워크를 통해 데이터를 송수신할 수 있게 됩니다.
소켓의 유형
소켓 프로그래밍에는 주로 두 가지 유형의 소켓이 사용됩니다.
- TCP 소켓: 신뢰성 있는 연결 지향적 통신을 제공합니다. 데이터가 순서대로 전송되며, 전송된 데이터의 정확성이 보장됩니다.
- UDP 소켓: 연결이 없는 통신을 제공합니다. TCP보다 빠르지만, 데이터의 순서나 정확성이 보장되지 않습니다.
소켓 프로그래밍 예제: TCP 소켓
서버 코드 (C#)
using System; using System.Net; using System.Net.Sockets; using System.Text; class Server { static void Main(string[] args) { //DNS(Domain Name System) string host = Dns.GetHostName(); IPHostEntry iphost = Dns.GetHostEntry(host); IPAddress ipAddress = iphost.AddressList[0]; IPEndPoint endPoint = new IPEndPoint(ipAddress, 8080); // 소켓 생성 Socket listener = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { listener.Bind(endPoint); listener.Listen(10); while (true) { Console.WriteLine("Server is listening on port 8080..."); // 클라이언트 연결 대기 Socket client = listener.Accept(); Console.WriteLine("Client connected."); // 데이터 수신 byte[] buffer = new byte[client.ReceiveBufferSize]; int bytesRead = client.Receive(buffer); string receivedText = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"Received: {receivedText}"); // 클라이언트에게 응답 보내기 string responseText = "Hello from server"; byte[] responseBytes = Encoding.UTF8.GetBytes(responseText); client.Send(responseBytes); // 연결 종료 client.Shutdown(SocketShutdown.Both); client.Close(); } } catch (Exception e) { Console.WriteLine(e); throw; } } }
클라이언트 코드 (C#)
using System; using System.Net; using System.Net.Sockets; using System.Text; class Client { static void Main(string[] args) { // 서버에 연결 //DNS(Domain Name System) string host = Dns.GetHostName(); IPHostEntry iphost = Dns.GetHostEntry(host); IPAddress ipAddress = iphost.AddressList[0]; IPEndPoint endPoint = new IPEndPoint(ipAddress, 8080); Socket client = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { client.Connect(endPoint); Console.WriteLine("Connected to server."); // 서버에 데이터 전송 string message = "Hello from client"; byte[] messageBytes = Encoding.UTF8.GetBytes(message); client.Send(messageBytes); // 서버로부터 응답 수신 byte[] buffer = new byte[client.ReceiveBufferSize]; int bytesRead = client.Receive(buffer); string receivedText = Encoding.UTF8.GetString(buffer,0,bytesRead); Console.WriteLine($"Received: {receivedText}"); // 연결 종료 client.Shutdown(SocketShutdown.Both); client.Close(); } catch (Exception e) { Console.WriteLine(e); throw; } } }
이 예제는 간단한 TCP 서버와 클라이언트를 구현합니다. 서버는 8080 포트에서 클라이언트의 연결을 기다립니다. 클라이언트가 연결되면, 클라이언트로부터 메시지를 받고, 그 메시지를 콘솔에 출력한 다음, 클라이언트에게 응답 메시지를 전송합니다. 클라이언트는 서버에 연결하여 메시지를 전송하고, 서버로부터의 응답을 받아 출력한 후 연결을 종료합니다.
소켓 프로그래밍의 주요 개념
- 연결 수립(Connection Establishment): TCP 소켓을 사용할 때, 서버와 클라이언트 간에는 먼저 연결이 수립되어야 합니다. 이 과정에서 서버는 연결 요청을 기다리고(리스닝), 클라이언트는 서버의 특정 포트로 연결을 시도합니다.
- 데이터 전송(Data Transmission): 연결이 수립되면, 서버와 클라이언트는 데이터를 주고받을 수 있습니다. 데이터는 바이트 배열로 전송되며, 송수신 양측에서는 이 데이터를 적절한 형식으로 인코딩하거나 디코딩해야 합니다.
- 연결 종료(Connection Termination): 데이터 전송이 완료되면, 연결을 종료해야 합니다. 이는 리소스를 해제하고, 시스템이 다른 연결 요청을 처리할 수 있도록 합니다.
소켓 프로그래밍의 중요성
소켓 프로그래밍은 분산 시스템, 웹 애플리케이션, 실시간 데이터 처리 시스템 등 다양한 분야에서 핵심적인 역할을 합니다. 이를 통해 개발자는 네트워크를 통한 효율적인 데이터 교환 메커니즘을 구축할 수 있습니다. 또한, 소켓 프로그래밍은 프로토콜의 이해와 네트워크 프로그래밍 기술을 향상시키는 데 도움이 됩니다.
결론
소켓 프로그래밍은 네트워크 통신의 기본이며, 현대 컴퓨팅 환경에서 중요한 기술입니다. TCP/IP 모델을 기반으로 하는 소켓 프로그래밍을 통해, 안정적이고 신뢰할 수 있는 데이터 통신을 구현할 수 있습니다. 기본적인 소켓 프로그래밍의 원리를 이해하고, 실제 코드 예제를 통해 실습함으로써, 네트워크 프로그래밍의 깊은 이해로 나아갈 수 있습니다.
반응형다음글이전글이전 글이 없습니다.댓글