간단한 Socket 통신 구현 (C#)

2021년 08월 14일
태그 csharp

Reference 👉👉 Microsoft Docs

게임에 소켓 통신을 적용하고 싶어서 Microsoft의 문서에 소개된 샘플 코드를 테스트해봤다. (편의를 위해 아주 약간 수정했다.)

Client Socket

using System;
using System.Text;
using System.Net.Sockets;

public class ClientSocket
{
    public void Client(string server, int port, string message)
    {
        try
        {
            TcpClient client = new TcpClient(server, port);

            Byte[] data = Encoding.ASCII.GetBytes(message);

            NetworkStream stream = client.GetStream();
            stream.Write(data, 0, data.Length);

            Console.WriteLine("Sent: {0}", message);

            data = new Byte[256];
            String responseData = String.Empty;

            Int32 bytes = stream.Read(data, 0, data.Length);
            responseData = Encoding.ASCII.GetString(data, 0, data.Length);
            Console.WriteLine("Received: {0}", responseData);

            stream.Close();
            client.Close();
        }
        catch (ArgumentException e)
        {
            Console.WriteLine("ArgumentNullException: {0}", e);
        }
        catch (SocketException e)
        {
            Console.WriteLine("Socket Exception: {0}", e);
        }

        Console.WriteLine("\n Press Enter to continue...");
        Console.Read();
    }
}

클라이언트 소켓이다. 서버의 로컬 주소와 포트 넘버를 알아야한다.

데이터를 보내면, 데이터를 받은 서버가 보내준 데이터(responseData:여기서는 Upper case로 수정한 문자열)를 받아와 바로 출력해주었다.

클라이언트

Server Socket

using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;

public class ServerSocket
{
    public void Server()
    {
        TcpListener server = null;
        Int32 port = 13000;
        IPAddress localAddr = IPAddress.Parse("127.0.0.1");

        try
        {
            server = new TcpListener(localAddr, port);
            server.Start();

            Byte[] bytes = new Byte[256];
            String data = null;

            while (true)
            {
                Console.Write("Waiting for connection...");
                TcpClient client = server.AcceptTcpClient();
                Console.Write("Connected!");

                data = null;

                NetworkStream stream = client.GetStream();
                int i;

                while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                {
                    data = Encoding.ASCII.GetString(bytes, 0, i);
                    Console.WriteLine("Received: {0}", data);

                    data = data.ToUpper();

                    byte[] msg = Encoding.ASCII.GetBytes(data);

                    stream.Write(msg, 0, msg.Length);
                    Console.WriteLine("Sent: {0}", data);
                }
                client.Close();
            }
        }
        catch (SocketException e)
        {
            Console.WriteLine("Socket Exception: {0}", e);
        }
        finally
        {
            // stop listening for new clients
            server.Stop();
        }

        Console.WriteLine("\nHit enter to continue...");
        Console.Read();
    }
}

서버 소켓이다. 주소를 지정하여 서버를 열면 Listening 상태로 클라이언트 소켓이 데이터를 보내길 기다린다(AcceptTcpClient()).

연결이 되면 데이터를 읽어온다. 마찬가지로 Write를 이용해 받은 데이터에 대한 답을 보낸다. 이 작업이 끝나면 서버는 클라이언트 소켓을 종료시키고 다음 클라이언트와의 연결을 기다린다.

서버 대기
서버 수신 완료