[C# 서버] 소켓 서버 문서
·
server/socket server
C# 기반으로 제작한 소켓 서버의 문서입니다. 이 서버는 Unity 엔진을 위해 제작되었으며, 온라인 게임을 포함하여 시뮬레이션, 하드웨어 제어 등 다양한 분야에서 사용될 수 있습니다. HTML 삽입 미리보기할 수 없는 소스
[Socket + MySql] 비동기 쿼리 사용 This MySqlConnection is already in use.
·
server/socket server
클라이언트 서버 DB 관계에서는 비동기 쿼리 호출응답을 사용하여야 하는데, 멀티쓰레드 환경에서 오류가 발생하였고, 이를 해결하여 정리해봤습니다. 📺 오류 This MySqlConnection is already in use. 오류가 나오며 현재 이 Connection이 사용중이라고 나옵니다. 💬 오류 스크립트 using MySqlConnector; using Server.Game; using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; /// /// MySQL 쿼리 매니저 /..
[C# 서버] RSA(공개키) 방식으로 통신
·
server/socket server
서버와 클라이언트 간 통신에서 비밀번호와 같은 민감한 정보를 공개키 방식으로 통신하는 이유는 보안과 개인 정보 보호를 강화하기 위해서입니다. 공개키 암호화는 대칭키 암호화에 비해 추가적인 보안 기능을 제공합니다. 💬 시작하기 앞서... 본 글은 소켓 서버 자체 구축 중 로그인 기능을 구현하기위해 서버로 비밀번호를 요청할 때 비밀번호를 평문으로 보내면 유출가능성이 있어 이를 해결하기위한 공개키 암호화 방식을 사용하는 방법을 구현하고 정리한 글 입니다. 💬 서론 공개키 암호화 방식은 공개키와 개인키라는 두 개의 키를 사용합니다. 공개키는 모든 사람에게 공개되어 있으며, 개인키는 키 소유자에게만 비밀로 유지됩니다. 이 방식은 다음과 같은 장점을 가지고 있습니다. 기밀성: 공개키로 암호화된 정보는 개인키로만 해..
[구글 프로토콜 버퍼] 패킷 한글 주석 인코딩 해결
·
server/socket server
PROTOBUF를 이용하여 패킷을 생성할 때 한글주석 인코딩이 깨지는 문제가 발생하여 개발에 불편함을 줘 이를 해결하는 방법을 찾아 해결하고 정리하였습니다. 💬 문제점 위와같이 주석 인코딩이 깨져 알 수 없는 문자로 나타나는 것을 볼 수 있습니다. 인코딩 문제는 UTF-8로 인코딩을 바꿔 어렵지 않게 해결할 수 있습니다. 📖 해결 방법 *.proto 파일의 확장자를 txt로 바꿔줍니다. txt로 바꾼 파일을 메모장으로 열고 다른 이름으로 저장을 클릭합니다. 파일명과 이름을 그대로 둔 채 인코딩을 UTF-8로 선택하고 저장합니다. txt 확장자를 다시. proto로 바꿔줍니다. proto 파일을 기반으로 패킷을 생성합니다. 한글로 정상적으로 패킷의 주석이 나오는것을 볼 수 있습니다. 🕹️ Unity Aff..
[유니티] 포톤(Photon) - 특정 대상에게만 RPC 호출
·
server/unity_photon
한 플레이어에게만 보내면 되는 함수가 있을경우 대상 플레이어게만 RPC를 보내면 네트워크 대역폭과 처리량을 절약할 수 있어서 게임의 성능과 안정성을 향상시킬 수 있습니다. 이번 글에서는 특정 플레이어게만 RPC를 보내는 방법을 다루겠습니다. ✅ 구현(스크립트 작성) · 전역 함수 using UnityEngine; using Photon.Pun; public class UtilityManager : MonoBehaviour { ... // 닉네임을 가진 플레이어에게만 RPC를 호출하는 함수 public static void CallRpcForPlayerWithName(string rpcMethodName, string targetPlayerName, params object[] parameters) { P..
[Web] Blazor에 자바스크립트(JS) 연동
·
server/web server
웹 프로그래밍에서 많이 사용되는 자바스크립트를 Blazor에 연동하여 동작할 수 있도록 구현하는 방법을 다룹니다. Blazor C#으로는 구현이 어려운 기능을 자바스크립트로 구현하여 사용할 수 있기에 중요합니다. · JS파일 생성 및 등록 자바스크립트 파일을 생성합니다. wwwroot폴더 하위에 생성합니다. test.js라는 이름으로 생성하였습니다. Pages/_Host.cshtml에서 라고 설정하여 test.js 파일을 등록합니다. · JS 작성 var func = (function () { window.testFunction = { helloWorld: function () { return alert("Hello World"); }, inputName: function (text) { return p..
[Web] 다이얼로그박스 및 유효성 검사
·
server/web server
Blazor Web에서 기본적으로 지원하는 Form과 Form에 대한 유효한 값을 확인하는 Validation을 학습하고 정리하였습니다. · Validation? 입력필드에 대해서 유효성을 검사합니다. 예를 들어 사용자가 회원가입을 할 때 비밀번호를 입력하지 않을 때 경고문을 띄워주고, 이메일 형식을 사용하는 페이지에서 이메일형태가 아닌 아이디만 입력했을 때 알려주는 등의 기능들을 말합니다. · 구현 Blazor Server App의 기본 예제를 활용하여 구현합니다 · WeatherForecast.cs using System.ComponentModel.DataAnnotations; namespace Blazor_From_Validation.Data { public class WeatherForecast ..
[Web] 서비스 타입
·
server/web server
Blazor Web에는 세가지의 서비스가 있습니다. 서비스 세개인 'Singleton, Transient, Scoped'의 차이점을 살펴보겠습니다. · Singleton 많이 알려진 싱글톤 타입과 동일하게 프로그램 내에 단 한개의 싱글 인스턴스만 존재하여 갱신되지 않습니다. · Transient '일시적인' 이라는 뜻으로 스크립트 또는 요청마다 갱신되어 새로운 인스턴스를 가지게 됩니다. · Scoped Singleton과 Transient의 중간 형태로 사용자가 웹에 접속한 시점에 갱신이 됩니다. Singleton과 다르게 전역으로 모두에게 동일한 인스턴스가 아닌 개개인마다 각각의 인스턴스를 가지도록 합니다. · 예시 세개의 서비스를 생성하고 GUID를 가지고 있도록하고 이것이 어떻게 바뀌는지 보도록 하..
[Web] Dependency Injection
·
server/web server
의존성 및 문제점에 대해서 간단히 다루고 이를 해결하기 위한 '의존성 주입'에 대해 다룹니다. · 의존성? 의존성에 대해서는 많이 알려져있기때문에 간단하게 설명하면, 'A'가 변경될경우 'A'와 관련된 다른것들이 바뀌어야 한다는 것을 의미합니다. · 예시 요구사항은 다음과 같습니다. "식품 서비스 FoodService를 FastFoodService로 바꿔서 서비스해주세요." FoodService는 한식을 다루고, FastFoodService는 패스트푸드를 다룹니다. public class Food { public string Name { get; set; } public int Price { get; set; } } public class FoodService { public List GetFoods()..
[Web] 템플릿 컴포넌트
·
server/web server
모든 타입에 대해 재사용성을 높이고 편리하게 출력하기 위해 컴포넌트 자체를 템플릿으로 선언하여 사용할 수있습니다. 본 글에서는 데이터를 보여줄 테이블을 템플릿을 구현하였습니다. · TableTemplate @using BlazorApp.Data; @typeparam TItem TableTemplate @Header @foreach (var item in Items) { @Row(item) } @code { [Parameter] public RenderFragment Header { get; set; } [Parameter] public RenderFragment Row { get; set; } [Parameter] public IReadOnlyList Items { get; set; } } [Parame..
[Web] Cascading 파라미터
·
server/web server
스크립트에 포함된 변수를 다른 컴포넌트에서도 접근하도록 하기위해 바인딩을 사용하지만 컴포넌트 안에 또다른 컴포넌트가 포함될때 해당 컴포넌트에게까지 변수를 접근하도록 하기위해서 간편한 방법인 Cascading이 있습니다. 매우 간단한 내용입니다. · Cascading 상위 구성 요소에서 원하는 수의 하위 구성 요소로 데이터를 전달하는 편리한 방법을 제공합니다. ASP.NET Core Blazor 연계 값 및 매개 변수 상위 Razor 구성 요소에서 하위 구성 요소로 데이터를 전달하는 방법을 알아봅니다. learn.microsoft.com 더보기 @page "/user" @using BlazorApp.Data; Online Users Theme Color: @foreach(var option in _opti..
[Web] 컴포넌트 재사용
·
server/web server
동일한 기능을 수행하는 컴포넌트를 다른 페이지에서 재사용하기위해 단순히 전체 스크립트를 복사-붙여넣기 하는 방식이 아닌 컴포넌트로 관리하여 다른 페이지에서 불러오면 되는 방식을 학습하였습니다. 파라미터, 레퍼런스, 콜백이벤트를 다룹니다. · ShowUser.razor @using BlazorApp.Data; 유저 수: @Users.Count() @foreach (UserData user in Users) { ❌ @user.Name } @code { // 파라미터를 명시하여 사용 [Parameter] public List Users { get; set; } // 자식 컴포넌트에서 부모의 컴포넌트 함수를 호출하기위한 액션함수 [Parameter] public EventCallback CallBackTest ..
[Web] 바인딩 변수 업데이트
·
server/web server
바인딩 한 변수의 값을 변경하였는데도 화면에서는 바뀌지 않는 경우가 있습니다. 이런 상황에서 강제로 업데이트를 통해 현재의 변수값으로 보여주도록 하는 방법을 정리하였습니다. · 항상 동기화하지 않는다! 바인딩을 한 변수가 변경된다고해서 항상 화면에 업데이트 된 값으로 변경되는것은 아닙니다. @page "/counter" @using System.Threading; Counter Counter Current count: @currentCount Click me Auto Increment @code { private int currentCount = 0; private void IncrementCount() { currentCount++; } private void AutoIncrement() { var t..
[Web] 속성 바인딩
·
server/web server
코드 영역의 변수나 리스트와 같은 자료구조뿐만 아니라 HTML에서 사용할 attrubute 또한 문자열 변수를 바인딩하여 속성 자체를 변경할 수 있습니다. · 속성 바인딩 더보기 @page "/user" @using BlazerApp.Data; Online Users 유저 수: @_users.Count() @foreach (UserData user in _users) { ❌ @user.Name } Add a User @code { List _users = new List(); string _inputName; string _btnClass = "btn btn-primary"; //버튼의 속성 //해당 페이지에 접속한경우, Unity의 Start와 비슷한 느낌 protected override void O..
[Web] List 바인딩
·
server/web server
'바인딩'을 학습하고 나서 단순한 변수가 아닌 특정 요소를 여러개 담는 리스트를 사용하고 이를 바인딩하여 리스트내의 요소에 접근하고, 삽입 삭제 연산을 하는 웹을 구현하였습니다. @page "/user" @using BlazerApp.Data; Online Users 유저 수: @_users.Count() @foreach (UserData user in _users) { ❌ @user.Name } Add a User @code { List _users = new List(); string _inputName; //해당 페이지에 접속한경우, Unity의 Start와 비슷한 느낌 protected override void OnInitialized() { //더미 데이터 세개 추가 _users.Add(new ..
[Web] 바인딩
·
server/web server
'데이터 바인딩'에 대해서 이해하고, 간단한 스크립트 예제를 정리하였습니다. · 데이터 바인딩? 데이터 바인딩은 앱 UI와 해당 UI가 표시하는 데이터를 연결하는 프로세스입니다. 바인딩 설정이 올바르고 데이터가 적절한 알림을 제공하는 경우 데이터 값이 변경될 때 데이터에 바인딩된 요소에 변경 사항이 자동으로 반영됩니다. · 단방향 바인딩 @page "/binding" Binding @page "/binding" Binding
[Web] Blazor Server App 프로젝트 시작
·
server/web server
웹서버를 간단하게 구축하기위해 Blazor을 학습하고 이를 정리합니다. 실습 환경은 VS2022 .NET7.0에서 진행하였습니다. ✅ 실습 준비 1. VS Installer에서 'ASP.NET 및 웹 개발'을 설치합니다. 2. VS2022에서 새 프로젝트를 만듭니다. 블레이저 서버 앱으로 생성합니다. 3. 생성된 프로젝트를 컴파일하여 데모 웹페이지가 잘 나오는지 확인합니다.
[C#] LINQ(Language-Integrated Query) 2
·
server/web server
더보기 using System.Security.Cryptography; namespace Study { class Program { public enum ClassType { Knight, Archer, Mage } public class Player { public ClassType ClassType; public int Level; public int Hp; public int Attack; public List Items = new List(); } static List _players = new List(); static void Main(string[] args) { Random rand = new Random(); for (int i = 0; i < 100; ++i) { Player playe..
[C#] LINQ(Language-Integrated Query) 1
·
server/web server
💡 LINQ? C# 언어에 직접 쿼리 기능을 통합하는 방식을 기반으로 하는 기술 집합 이름입니다. 쿼리는 데이터 소스에서 데이터를 검색하는 식입니다. 쿼리는 일반적으로 특수화된 쿼리 언어로 표현됩니다. Language-Integrated Query (LINQ) (C#) Learn about Language-Integrated Queries (LINQs) and review an example of the complete query operation. learn.microsoft.com 📝 LINQ 사용 예제를 통해 LINQ를 어떤 상황에 사용하면 좋을지 비교하여 확인해보겠습니다. · 준비작업 아래의 스크립트를 이용하여 Player의 정보를 담는 리스트를 무작위로 생성합니다. namespace Study ..
[C# 서버] Async Session, Event
·
server/socket server
📄 Async Session 지난 글과 작동은 같지만, 버퍼를 성공적으로 송신하거나, 수신할 때를 다룹니다. 더욱 효율적인 송신 방법과 각 이벤트가 성공적으로 수행되면 Event를 통해 확인할 수 있도록 학습하였습니다. 📑 Session using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace ServerCore { public abstract class Session { Socket mSocket; int mIsDisconnected = 0; //현재 Disc..
[C# 서버] Async Listener
·
server/socket server
📄 비동기 리스너 지난 글[네트워크 서버 구축(C#) 12.소켓 프로그래밍]에서 간단한 소켓 통신을 하는 프로그램을 작성하였습니다. 하지만 작성했던 프로그램은 동기성 프로그램으로, 블로킹방식을 사용하기때문에 서버나 클라이언트에서 소켓을 받을때까지 기다려야 합니다. 직관적이고 간단하다는 장점이 있지만, 적합한 모델은 아니기때문에 비동기 방식의 리스너를 공부하여 이를 정리했습니다. 📑 Listener using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace Serv..
[C# 서버] 소켓 프로그래밍
·
server/socket server
📄 소켓 프로그래밍 지금까지 네트워크의 기본적인 이론을 다뤘다면, 이제부터 클라이언트와 서버 간 통신을 위한 프로그램을 작성해보도록 하겠습니다. 📑 Server using System.Net; using System.Net.Sockets; using System.Text; namespace ServerCore { class Program { private static void Main(string[] args) { //DNS 사용 string host = Dns.GetHostName(); //현재 로컬의 호스트를 가져옴 IPHostEntry ipHost = Dns.GetHostEntry(host); IPAddress ipAddress = ipHost.AddressList[0]; //배열로 들어있는 값 중..
[C# 서버] Thread Local Storage
·
server/socket server
📄 TLS TLS(스레드 로컬 스토리지)는 스레드에 로컬인 정적 또는 전역 메모리를 사용하는 컴퓨터 프로그래밍 방법입니다. 이 기능은 정적, 전역변수를 각 스레드에게 독립적인 형태로 만들어주고싶을때 사용할 수 있습니다. 📑 정적 변수 namespace ServerCore { class Program { static string ThreadName; static void WhoAmI() { ThreadName = $"My Name Is {Thread.CurrentThread.ManagedThreadId}"; Thread.Sleep(1000); Console.WriteLine(ThreadName); } private static void Main(string[] args) { //Invoke에 넣는 액션만큼..
[C# 서버] ReaderWriterLock 구현
·
server/socket server
📄 ReaderWriterLock ReaderWriterLock은 이전 글[유니티 서버 구축(C#) 9.ReaderWriterLock]에서 다뤘습니다. 상호배제를 위한 기능은 동일하지만, 데이터에 대해 읽기, 쓰기에 대한 호출의 비율이 매우 편중되어있을 때 적합한 방법입니다. 📑 Lock.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ServerCore { //재귀적 락을 허용하지 않는 모델 class Lock { //음수가 될 수 있기에 최상위비트 사용하지 않음 const int EMPTY_FLAG = 0x00000000..
[C# 서버] ReaderWriterLock
·
server/socket server
📄 ReaderWriterLock 상호배제를 위한 기능은 동일하지만, 데이터에 대해 읽기, 쓰기에 대한 호출의 비율이 매우 편중되어있을 때 적합한 방법입니다. 예를들어 플레이어들이 서버로부터 아이템을 보상을 받는다고 할때 플레이어는 단순히 서버로부터 획득할 아이템 정보를 읽으면 됩니다. 읽는것만으로는 큰 문제가 되지 않습니다. 이 상태에 일반적인 Lock을하여 읽는것에대해 상호배제를 적용한다면 아쉬운 성능을 보여줄 수 있습니다. 서버 관리자가 가끔씩 보상 아이템을 설정하기위해 쓰기를 하는 경우를 들었을때 플레이어들이 읽는것에 비해 빈도가 아주 적게 일어나 아주 가끔씩 Lock을해야하는 경우 이 방법을 사용하면 더욱 효과적입니다. 📑 ReaderWriterLockSlim namespace ServerCor..
[C# 서버] Mutex
·
server/socket server
📄 Mutex Mutex는 AutoResetEvent와 비슷하게 상호배제를 위한 기능으로 사용할 수 있습니다. AutoResetEvent와 다르게 더 많은 정보를 내부에 지니고 있으며 예로 다중Lock을 하여 몇번 Lock을 했는지, 스레드ID를 가지고있어 자신을 Lock시킨 스레드를 알고, 추후에 다른 스레드에서 자신을 Release했는지 확인하여 잘못된 코드를 확인할 수 있는 기능을 지닙니다. 하지만 더 많은 정보를 가지고 있기에 보다 느리게 동작합니다. 📑 Mutex namespace ServerCore { class Program { static int number = 0; static Mutex _lock = new Mutex(); static void Thread1() { for(int i =..
[C# 서버] AutoResetEvent
·
server/socket server
📄 AutoResetEvent SpinLock에서 스레드는 언락 된 상태를 확인할 때까지 계속 반복하여 체크를 해야 했습니다. 하지만 이것은 자원을 낭비하는 것으로 적합하지 못할 수 있습니다. C#에서 제공하는 AutoResetEvent는 while(true){}처럼 무한루프를 돌지 않고, 커널에 요청을 하여 "내가 접근할 수 있을 때 알려줘"라는 요청을 할 수 있습니다. 이것은 매우 간편하게 사용할 수 있지만, 커널에 접근하여 수행을 하기에 매우 느리다는 단점이 있습니다. 📑 AutoResetEvent namespace ServerCore { class Lock { //boolean 변수 같은 개념 //Auto: 자동으로 문을 닫아주는 기능을 포함 AutoResetEvent _available = ne..
[C# 서버] Context Switching
·
server/socket server
📄 Context Switching 이전 글에서 스핀락에서는 스레드가 락 획득을 위해 while() 문에서 획득하기 전까지 무한반복하여 획득을 얻고자 한다는것을 다뤘습니다. 하지만 획득을 위한 무한루프는 큰 낭비이며, 이것을 개선하고자 다른 스레드에게 자원을 나눠줄 수 있습니다. 비슷한 세가지의 방법을 다루며, 스레드의 작업을 쉬고, 다른 스레드에게 남은 자원을 할당하여 작업하게 하는것을 Context Switching이라고 합니다. Context Switching은 무한반복하여 획득을 얻고자하는 스레드가 있을때, 다른 스레드가 작업을 할 수 있도록 하는 장점을 가지고 있지만, Context Switching을 하기위한 작업이 적은 비용이 아니기때문에 이러한 문제를 충분히 고려해야합니다. 무조건적으로 다..
[C# 서버] 스핀락
·
server/socket server
📄 스핀락 스핀락은 잠금을 획득하려는 스레드가 특정 코드가 현재 사용 가능한지 반복적으로 확인하면서 단순히 루프('스핀')에서 기다리는 것입니다. 스레드는 활성 상태를 유지하지만 계속 락에 대한 검사를 수행하는 형태를 띱니다. 장점: spinning 중이고 스레드가 휴지 상태가 아니기 때문에 콘텍스트 전환이 필요하지 않습니다. 크리티컬 섹션(스레드가 동시에 접근해서는 안 되는 공유 자원을 접근하는 코드)이 작으면 도움이 됩니다. 단점: Spinlock은 spinning이 필요합니다. 락 상태에서 사용할 수 없으면 액세스 가능한지 반복적으로 확인합니다.(CPU를 낭비) 📑 SpinLock 이론 namespace ServerCore { class SpinLock { private volatile bool m..
[C# 서버] 원자성, Interlocked, Monitor, lock
·
server/socket server
📄 원자성 스레드 환경에서 원자성이란, 간단히 말해 어떠한 계산을 수행할 때 한번에 끝난다(한 줄에 끝난다)라고 표현할 수 있습니다. 계산을 위한 연산이 여러단계에 걸치면, 여러 스레드에서 공유변수에대해 서로 참조를하다보면 어긋날 수 있는 문제(경합조건)가 발생할 수 있습니다. 📑 예제 namespace ServerCore { class Program { static int number = 0; static void Thread1() { for (int i = 0; i < 10000000; ++i) { number++; //int temp = number; //temp += 1; //number = temp; } } static void Thread2() { for (int i = 0; i < 10000..
bonnate
'server' 카테고리의 글 목록