C# 소켓 통신 서버 개발하기 Windows에서 개발하여 Linux CentOS 7.6 서버에서 실행하기
이 블로그 포스트에서는 Windows 10의 Visual Studio 2022를 이용하여 C# 소켓 통신 프로그램을 제작하고, CentOS 7.6 Linux 가상 서버로 전송하여 실행하는 전체 과정을 설명합니다. 서버 프로그램은 소켓을 통해 클라이언트의 연결을 받아 메시지를 주고받으며, 클라이언트 프로그램은 서버에 연결하여 메시지를 송신하고 응답을 받습니다.
목차
- 개발 환경 설정 (Windows 10)
- C# 소켓 통신 프로그램 작성 (Visual Studio 2022)
- 프로젝트 빌드 및 결과물 생성
- 파일을 Linux 서버로 전송
- Linux 서버에서 소켓 통신 프로그램 실행 환경 설정
- 애플리케이션 실행 및 테스트
1. 개발 환경 설정 (Windows 10)
먼저, Windows 10에 Visual Studio 2022와 .NET SDK를 설치해야 합니다.
- Visual Studio 2022 설치:
- Visual Studio 2022 다운로드 페이지에서 설치 프로그램을 다운로드합니다.
- 설치 프로그램을 실행하고 ASP.NET and web development, .NET Core cross-platform development와 같은 워크로드를 선택하여 설치합니다.
- .NET SDK 설치:
- Microsoft .NET 다운로드 페이지에서 최신 .NET SDK를 다운로드하여 설치합니다.
2. C# 소켓 통신 프로그램 작성 (Visual Studio 2022)
서버 프로그램 작성
- Visual Studio 2022를 실행하고 새 프로젝트 만들기를 선택합니다.
- C# 콘솔 애플리케이션 템플릿을 선택하고 프로젝트 이름을 SocketServer로 설정합니다.
- 아래 코드를 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();
}
}
}
}
클라이언트 프로그램 작성
- 새 프로젝트 만들기를 선택하여 SocketClient라는 이름으로 새로운 C# 콘솔 애플리케이션을 만듭니다.
- 아래 코드를 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. 프로젝트 빌드 및 결과물 생성
- 솔루션 탐색기에서 SocketServer 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 빌드를 선택하여 프로젝트를 빌드합니다.
- SocketClient 프로젝트도 동일한 방식으로 빌드합니다.
- 빌드가 성공하면 bin\Release\net6.0 또는 bin\Debug\net6.0 폴더에 실행 파일(.dll)이 생성됩니다.
4. 파일을 Linux 서버로 전송
SCP(Secure Copy Protocol)를 사용하여 빌드된 파일을 Linux 서버로 전송합니다.
- 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 런타임 설치
- Microsoft 패키지 리포지토리 설정:
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
- .NET 런타임 설치:
sudo yum install dotnet-runtime-6.0
포트 열기
firewalld 시작 및 활성화 확인:
sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo systemctl status firewalld
- 포트 7777열기:
sudo firewall-cmd --zone=public --add-port=7777/tcp --permanent
sudo firewall-cmd --reload
- 포트가 열렸는지 확인:
sudo firewall-cmd --list-ports
6. 애플리케이션 실행 및 테스트
서버 애플리케이션 실행
- SSH를 통해 Linux 서버에 접속합니다.
- 서버 프로그램을 실행합니다.
dotnet /path/to/destination/SocketServer.dll
서버가 포트 7777에서 소켓 연결을 대기하게 됩니다.
클라이언트 애플리케이션 실행
- Windows에서 SocketClient 프로그램을 실행합니다. Visual Studio에서 실행하거나 명령 프롬프트에서 다음 명령을 사용할 수 있습니다.
dotnet path\to\SocketClient.dll
클라이언트가 서버에 연결하고 메시지를 송신한 후 응답을 받게 됩니다. 정상적으로 실행되면 서버의 콘솔 창에서 수신된 메시지를 확인할 수 있습니다.
이 과정을 통해 Windows 10에서 개발한 C# 소켓 통신 프로그램을 CentOS 7.6 서버에서 실행하고, 클라이언트와 서버 간의 소켓 통신을 테스트할 수 있습니다.
'Programming > C#' 카테고리의 다른 글
깔끔한 C# 코드 작성을 위한 필드 가이드 (7) | 2024.11.12 |
---|---|
C# 이벤트 핸들러(Event Handler) 이해와 활용 (0) | 2024.07.11 |
C# 멀티스레드 프로그래밍 Thread-Local Storage(TLS)의 이해와 활용 (2) | 2024.07.01 |
C# 멀티스레드 프로그래밍 커스텀 재귀적 락과 스핀락 정책 구현 (0) | 2024.07.01 |
C#에서의 동기화 전략: ReadWriteLock의 이해와 활용 (0) | 2024.07.01 |