Visual C#을 사용하여 원격 서버 만들기
이 문서는 Visual C#을 사용하여 다른 애플리케이션이 액세스할 수 있는 원격 서버를 만드는 데 도움이 됩니다.
원래 제품 버전: Visual C#
원본 KB 번호: 307445
요약
이 문서에서는 다른 애플리케이션이 액세스할 수 있는 원격 서버를 만드는 방법을 보여 줍니다. 이 서버에 액세스하는 애플리케이션은 동일한 컴퓨터, 다른 컴퓨터 또는 다른 네트워크에 있을 수 있습니다. 원격 서버는 서버 개체와 서버 애플리케이션의 두 부분으로 구분됩니다. 서버 개체는 클라이언트가 통신하는 개체이며 서버 애플리케이션은 서버 개체를 .NET 원격 런타임 프레임워크에 등록하는 데 사용됩니다.
이 문서에서는 다음 Microsoft .NET Framework 클래스 라이브러리 네임스페이스를 참조합니다.
System.Runtime.Remoting
System.Runtime.Remoting.Channels
System.Runtime.Remoting.Channels.Tcp
요구 사항
이 문서에서는 다음과 같은 topics 잘 알고 있다고 가정합니다.
- Visual Studio .NET 또는 Visual Studio
- Visual C# .NET 또는 Visual C#
- 네트워킹
원격 서버 개체 만들기
서버 애플리케이션을 만드는 첫 번째 단계는 서버 개체를 만드는 것입니다. 서버 개체는 클라이언트 애플리케이션이 서버 컴퓨터에서 인스턴스화하고 통신하는 개체입니다. 클라이언트 애플리케이션은 클라이언트에서 만든 프록시 개체를 통해 이 작업을 수행합니다. 이 샘플에서 서버 개체는 DLL(클래스 라이브러리)에 있으며 myRemoteClass라고 합니다.
Visual C# .NET에서 새 클래스 라이브러리 애플리케이션을 만듭니다. 프로젝트 이름을 ServerClass로 지정합니다. Class1은 기본적으로 만들어집니다.
솔루션 탐색기 Class1.cs 코드 파일의 이름을 ServerClass.cs.
ServerClass.cs 열고 Class1의 이름을 myRemoteClass로 바꿉니다. 또한 클래스 이름과 일치하도록 클래스의 기본 생성자의 이름을 로 바꿔야 합니다. myRemoteClass 는 클래스에서
MarshalByRefObject
상속되어야 합니다. 이제 클래스가 다음과 같이 표시됩니다.public class myRemoteClass: MarshalByRefObject { public myRemoteClass() { // TO DO: Add constructor logic here. } }
문자열을 사용하고, 문자열 값을 사용하여 콘솔에 메시지를 표시하고, 문자열이 비어 있지 않으면 True를 반환하는 public 메서드를 myRemoteClass에 추가합니다.
public bool SetString(String sTemp) { try { Console.WriteLine("This string '{0}' has a length of {1}", sTemp, sTemp.Length); return sTemp != ""; } catch { return false; } }
프로젝트를 빌드하여 ServerClass.dll 어셈블리를 만듭니다.
프로젝트를 저장하고 닫습니다.
원격 서버 애플리케이션 만들기
클라이언트가 통신할 서버 개체를 만든 후에는 이 개체를 Remoting 프레임워크에 등록해야 합니다. 개체를 등록할 때 서버를 시작하고 클라이언트가 해당 포트에 연결할 수 있도록 서버가 포트에서 수신 대기하도록 해야 합니다. 이렇게 하려면 실행 파일을 출력하는 프로젝트 형식이 필요합니다.
서버 개체를 별도의 프로젝트에 포함시키는 이유는 클라이언트 프로젝트에서 서버 개체를 쉽게 참조할 수 있기 때문입니다. 참조는 DLL 파일로만 설정할 수 있으므로 이 프로젝트에 포함하면 참조할 수 없습니다.
Visual C# .NET에서 새 콘솔 애플리케이션을 만들어 원격 서버를 시작합니다. Class1 은 기본적으로 만들어집니다.
솔루션 탐색기 Class1.cs 파일의 이름을 RemoteServer.cs.
네임스페이스에 대한 참조를
System.Runtime.Remoting
추가합니다.이전 섹션에서 만든 ServerClass.dll 어셈블리에 대한 참조를 추가합니다.
코드의
using
뒷부분Remoting
에서 해당 네임스페이스에서 선언을 한정할 필요가 없도록 ,Remoting.Channels
및Remoting.Channels.TCP
네임스페이스의 문을 사용합니다. 다른 선언 전에using
문을 사용해야 합니다.using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp;
적절한 변수를 선언합니다. 이 예제의
TcpChannel
포트 8085인 특정 포트에서 클라이언트가 연결하도록 수신 대기하는 개체를 선언하고 초기화합니다. 메서드를RegisterChannel
사용하여 채널을 채널 서비스에 등록합니다. 의 프로시저Class1
에Main
다음 선언 코드를 추가합니다.TcpChannel chan = new TcpChannel(8085); ChannelServices.RegisterChannel(chan);
개체의
RegisterWellKnownType
메서드를RemotingConfiguration
호출하여 개체를ServerClass
Remoting 프레임워크에 등록하고 다음 매개 변수를 지정합니다.등록 중인 개체의 전체 형식 이름(이 예제에서는 ServerClass.myRemoteClass ) 뒤에 어셈블리 이름 ServerClass가 있습니다. 네임스페이스의 이름과 여기에 클래스 이름을 모두 지정합니다. 이전 섹션에서 네임스페이스를 지정하지 않았기 때문에 기본 루트 네임스페이스가 사용됩니다.
개체를 RemoteTest로 게시할 엔드포인트의 이름을 지정합니다. 클라이언트는 개체에 연결하기 위해 이 이름을 알아야 합니다.
개체 모드를
SingleCall
사용하여 최종 매개 변수를 지정합니다. 개체 모드는 서버에서 활성화될 때 개체의 수명을 지정합니다. 개체의SingleCall
경우 동일한 클라이언트가 동일한 메서드를 두 번 이상 호출하더라도 클라이언트가 만드는 각 호출에 대해 클래스의 새 instance 만들어집니다. 반면Singleton
에 개체는 한 번만 만들어지고 모든 클라이언트는 동일한 개체와 통신합니다.RemotingConfiguration.RegisterWellKnownServiceType( System.Type.GetType("ServerClass.myRemoteClass, ServerClass"), "RemoteTest", WellKnownObjectMode.SingleCall);
개체의
ReadLine
메서드를Console
사용하여 서버 애플리케이션을 계속 실행합니다.System.Console.WriteLine("Hit <enter> to exit..."); System.Console.ReadLine();
프로젝트를 빌드합니다.
프로젝트를 저장하고 닫습니다.
참조
.NET 원격에 대한 개요는 .NET Framework 개발자 가이드 설명서를 참조하세요.
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기