이번 포스팅에서는 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
네임스페이스를 사용합니다. 클라이언트와 서버 간의 데이터 통신을 위해 TcpClient
및 TcpListener
클래스를 사용할 수 있습니다.
아래는 간단한 클라이언트-서버 소켓 통신 예제입니다.
// 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#에서 데이터 직렬화를 활용한 소켓 통신에 대해 알아보았습니다.