본문 바로가기
Programming/C#

C# 소켓 통신 서버 개발하기 Windows에서 개발하여 Linux CentOS 7.6 서버에서 실행하기

by Dev_카페인 2024. 7. 11.
반응형

C# 소켓 통신 서버 개발하기 Windows에서 개발하여 Linux CentOS 7.6 서버에서 실행하기

 

이 블로그 포스트에서는 Windows 10의 Visual Studio 2022를 이용하여 C# 소켓 통신 프로그램을 제작하고, CentOS 7.6 Linux 가상 서버로 전송하여 실행하는 전체 과정을 설명합니다. 서버 프로그램은 소켓을 통해 클라이언트의 연결을 받아 메시지를 주고받으며, 클라이언트 프로그램은 서버에 연결하여 메시지를 송신하고 응답을 받습니다.

목차

  1. 개발 환경 설정 (Windows 10)
  2. C# 소켓 통신 프로그램 작성 (Visual Studio 2022)
  3. 프로젝트 빌드 및 결과물 생성
  4. 파일을 Linux 서버로 전송
  5. Linux 서버에서 소켓 통신 프로그램 실행 환경 설정
  6. 애플리케이션 실행 및 테스트

1. 개발 환경 설정 (Windows 10)

먼저, Windows 10에 Visual Studio 2022와 .NET SDK를 설치해야 합니다.

  • Visual Studio 2022 설치:
    1. Visual Studio 2022 다운로드 페이지에서 설치 프로그램을 다운로드합니다.
    2. 설치 프로그램을 실행하고 ASP.NET and web development, .NET Core cross-platform development와 같은 워크로드를 선택하여 설치합니다.

2. C# 소켓 통신 프로그램 작성 (Visual Studio 2022)

서버 프로그램 작성

  1. Visual Studio 2022를 실행하고 새 프로젝트 만들기를 선택합니다.
  2. C# 콘솔 애플리케이션 템플릿을 선택하고 프로젝트 이름을 SocketServer로 설정합니다.
  3. 아래 코드를 Program.cs 파일에 작성합니다.
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace SocketServer
{
    class Program
    {
        static void Main(string[] args)
        {
            int port = 7777;	// 여기에 통신을 원하는 포트를 입력하세요
            IPAddress localAddr = IPAddress.Any;
            TcpListener server = new TcpListener(localAddr, port);

            server.Start();
            Console.WriteLine("Server started on port " + port);

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

                NetworkStream stream = client.GetStream();
                byte[] buffer = new byte[1024];
                int bytesRead = stream.Read(buffer, 0, buffer.Length);
                string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead);
                Console.WriteLine("Received: " + dataReceived);

                string response = "Message received";
                byte[] responseData = Encoding.ASCII.GetBytes(response);
                stream.Write(responseData, 0, responseData.Length);

                client.Close();
            }
        }
    }
}

클라이언트 프로그램 작성

  1. 새 프로젝트 만들기를 선택하여 SocketClient라는 이름으로 새로운 C# 콘솔 애플리케이션을 만듭니다.
  2. 아래 코드를 Program.cs 파일에 작성합니다.
using System;
using System.Net.Sockets;
using System.Text;

namespace SocketClient
{
    class Program
    {
        static void Main(string[] args)
        {
            string server = "서버_IP_주소"; // 여기에 서버의 IP 주소를 입력하세요.
            int port = 7777;	// 여기에 통신을 원하는 포트를 입력하세요 (서버포트와 동일)

            TcpClient client = new TcpClient(server, port);
            NetworkStream stream = client.GetStream();

            string message = "Hello from client";
            byte[] data = Encoding.ASCII.GetBytes(message);
            stream.Write(data, 0, data.Length);

            byte[] buffer = new byte[1024];
            int bytesRead = stream.Read(buffer, 0, buffer.Length);
            string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);
            Console.WriteLine("Received: " + response);

            client.Close();
        }
    }
}

3. 프로젝트 빌드 및 결과물 생성

  1. 솔루션 탐색기에서 SocketServer 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 빌드를 선택하여 프로젝트를 빌드합니다.
  2. SocketClient 프로젝트도 동일한 방식으로 빌드합니다.
  3. 빌드가 성공하면 bin\Release\net6.0 또는 bin\Debug\net6.0 폴더에 실행 파일(.dll)이 생성됩니다.

4. 파일을 Linux 서버로 전송

SCP(Secure Copy Protocol)를 사용하여 빌드된 파일을 Linux 서버로 전송합니다.

  1. Windows 명령 프롬프트 또는 PowerShell을 열고 다음 명령을 입력합니다.
scp path\to\SocketServer.dll user@linux_server:/path/to/destination

 

가상 서버를 이용하여 scp로 파일을 전송할 경우 리눅스에 열려있는 ssh포트가 22번인지 확인합니다.

ssh 포트가 22번이 아니라면 

scp -p {portNumber} {FilePath} {id}@{serverip}:{savepath}를 입력합니다.

파일 전체를 옮기려면 scp -r 명령을 추가합니다.

파일 전체와 포트를 지정하려면 scp -rp 명령을 수행합니다.

5. Linux 서버에서 소켓 통신 프로그램 실행 환경 설정

Linux 서버에서 .NET 런타임을 설치하고 포트 7777을 열어야 합니다.

.NET 런타임 설치

  1. Microsoft 패키지 리포지토리 설정:
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
  1. .NET 런타임 설치:
sudo yum install dotnet-runtime-6.0

포트 열기

firewalld 시작 및 활성화 확인:

sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo systemctl status firewalld
  1. 포트 7777열기:
sudo firewall-cmd --zone=public --add-port=7777/tcp --permanent
sudo firewall-cmd --reload
  1. 포트가 열렸는지 확인:
sudo firewall-cmd --list-ports

6. 애플리케이션 실행 및 테스트

서버 애플리케이션 실행

  1. SSH를 통해 Linux 서버에 접속합니다.
  2. 서버 프로그램을 실행합니다.
dotnet /path/to/destination/SocketServer.dll

서버가 포트 7777에서 소켓 연결을 대기하게 됩니다.

클라이언트 애플리케이션 실행

  1. Windows에서 SocketClient 프로그램을 실행합니다. Visual Studio에서 실행하거나 명령 프롬프트에서 다음 명령을 사용할 수 있습니다.
dotnet path\to\SocketClient.dll

클라이언트가 서버에 연결하고 메시지를 송신한 후 응답을 받게 됩니다. 정상적으로 실행되면 서버의 콘솔 창에서 수신된 메시지를 확인할 수 있습니다.

 

 

이 과정을 통해 Windows 10에서 개발한 C# 소켓 통신 프로그램을 CentOS 7.6 서버에서 실행하고, 클라이언트와 서버 간의 소켓 통신을 테스트할 수 있습니다.

반응형