[c#] C# 데이터 직렬화 소켓 통신

이번 포스팅에서는 C#을 사용하여 데이터를 직렬화하고, 소켓 통신을 통해 이러한 데이터를 전송하는 방법에 대해 알아보겠습니다. 데이터 직렬화는 객체를 네트워크를 통해 전송하기 위해 그 상태를 저장하고 다시 구성할 수 있는 형식으로 변환하는 프로세스를 의미합니다. 이를 통해 객체의 속성과 데이터를 전송할 수 있습니다.

데이터 직렬화

C#에서는 데이터 직렬화를 위해 System.Runtime.Serialization 네임스페이스를 제공합니다. 이 네임스페이스에는 DataContractSerializer를 사용하여 데이터를 XML이나 바이트 배열로 직렬화할 수 있는 기능이 제공됩니다.

아래는 데이터를 직렬화하는 간단한 예제입니다.

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

public class Program
{
    public static void Main()
    {
        // Serialize
        var data = new MyData { Name = "Alice", Age = 30 };
        var formatter = new BinaryFormatter();
        using (var stream = new MemoryStream())
        {
            formatter.Serialize(stream, data);
            byte[] serializedData = stream.ToArray();
            // Send serializedData over socket
        }

        // Deserialize
        using (var stream = new MemoryStream(serializedData))
        {
            MyData deserializedData = (MyData)formatter.Deserialize(stream);
            Console.WriteLine($"Name: {deserializedData.Name}, Age: {deserializedData.Age}");
        }
    }
}

[Serializable]
public class MyData
{
    public string Name { get; set; }
    public int Age { get; set; }
}

위 예제에서는 MyData 클래스의 데이터를 직렬화하고 다시 역직렬화하는 과정을 보여줍니다.

소켓 통신

C#에서 소켓 통신을 위해서는 System.Net.Sockets 네임스페이스를 사용합니다. 클라이언트와 서버 간의 데이터 통신을 위해 TcpClientTcpListener 클래스를 사용할 수 있습니다.

아래는 간단한 클라이언트-서버 소켓 통신 예제입니다.

// Server
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main()
    {
        TcpListener server = new TcpListener(IPAddress.Any, 9999);
        server.Start();
        Console.WriteLine("Server started");

        TcpClient client = server.AcceptTcpClient();
        NetworkStream stream = client.GetStream();

        byte[] data = new byte[1024];
        int length = stream.Read(data, 0, data.Length);
        Console.WriteLine(Encoding.UTF8.GetString(data, 0, length));

        stream.Close();
        client.Close();
        server.Stop();
    }
}

// Client
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main()
    {
        TcpClient client = new TcpClient();
        client.Connect(IPAddress.Loopback, 9999);
        NetworkStream stream = client.GetStream();

        string message = "Hello, server!";
        byte[] data = Encoding.UTF8.GetBytes(message);
        stream.Write(data, 0, data.Length);

        stream.Close();
        client.Close();
    }
}

위 예제에서는 간단한 TCP 소켓 통신을 통해 클라이언트가 서버로 메시지를 보내고 서버가 해당 메시지를 수신하는 과정을 보여줍니다.

소켓 통신을 보다 복잡하게 만들기 위해 데이터 직렬화를 활용하여 소켓 통신을 할 수 있습니다. 데이터를 직렬화하고 다시 역직렬화하여 객체를 전송함으로써 보다 복잡한 데이터도 주고받을 수 있게 됩니다.

이상으로 C#에서 데이터 직렬화를 활용한 소켓 통신에 대해 알아보았습니다.