아 ~~ 너무 감사합니다. 너무너무 도움이 되는 글입니다.
다시한번 감사드립니다.
정성훈.해미 님이 쓰신 글 :
: 제가 알고 있는 선(고급 지식 아님)에서
: 알려드립니다.
:
: 1. client 가 2군데 이상에서 연결이 되었을 경우 이들을 구분할 수 있나요?
: 예) master 권한과 단순 모니터링 참가자 ( 실제 제어 권한과 단순 모니터링 권한의 구분)
: >> 답변: 녜 구분 가능합니다.
: 서버는 접속된 클라이언트 갯수와 각 클라이언트의 정보를 알 수 있습니다.
: 그리고, 제어접속과 모니터링 접속을 구분은 접속 포트로 하는 것이 쉬울 것 같네요.
: 예) 제어용 접속: 8000번 포트
: 모니터링용 접속: 8100 포트
: *인디TCP서버에 8000과 8100포트를 바은드 시키고
: 접속 클라이언트의 포트정보를 보고 제어권한을 판단하면 될 것 같습니다.
: 코드 예)
:
: void __fastcall TForm1::TCPSExecute(TIdContext *AContext)
: {
: if(AContext->Connection->IOHandler->InputBufferIsEmpty()) {
: AContext->Connection->IOHandler->CheckForDataOnSource(1);
: if(AContext->Connection->IOHandler->InputBufferIsEmpty()) return;
: }
:
: TIdBytes ABuffer;
: AContext->Connection->IOHandler->ReadBytes(ABuffer, -1, false);
:
: // 제어 클라이언트 메시지 수신
: if(AContext->Binding->PeerPort == 8000) {
: //.....
: }
: // 모니터링 클라이언트 메시지 수신
: else {
: //.....
: }
: }
:
:
:
: 2. IndyTCPServer 를 잠시 테스트 했을 때 보니 보통 client에서 메시지를 보내면 그 메시지를 받고 OnExecute 에서 이벤트 처리로 응답을 보내게 되어 있던데 Client 에서 메시지를 받지 않는 상황에서 시스템 자체에서 현재 연결되어 있는 Client 들에게 특정 메시지를 보낼 수 있는지요?
: >> 답변: 인디TCP서버는 쓰레드기반입니다.
: OnExecute이벤트는 계속 실행되고 있는 쓰레드 함수라고 보시면 됩니다.
: 메시지를 받을 때 OnExecute에서 처리하시고
: 보낼때는 TCP서버의 Send함수를 직접 이용하십시오.
:
: 보통 대부분의 통신 콤포넌트들이 그렇듯
: 수신처리는 이벤트에서하고
: 송신처리는 직접 송신 함수를 이용합니다.
:
: 당연히 특정 클라이언트에게 메시지를 보낼 수 있습니다.
: 1)번의 답변에서 말했듯이
: 서버는 접속된 클라이언트들의 정보를 알 수 있기때문입니다.
: 코드 예)
:
: void TCPSend(Idglobal::TIdBytes ABuffer)
: {
: if(TCPS->Active) {
: TList* ClientsList = TCPS->Contexts->LockList();
:
: for(int i=0; iCount; i++) {
: TIdContext* pClient = (TIdContext*)ClientsList->Items[i];
: if(pClient->Connection->Connected()) {
: try {
: pClient->Connection->IOHandler->Write(ABuffer);
: } catch (...) {
: }
: }
: }
: TCPS->Contexts->UnlockList();
: }
: }
:
:
:
:
: 3. (2) 번 문항과 같은 의미 일수 있는데 서버는 클라이언트의 요청에 의해서만 응답을 하는 것인가요?
: >> 답변: 아닙니다.
: 언제든 원하실 때 아무때나 필요한 메시지를 보내면 됩니다.
:
: 4. OnExecute 이벤트에서 어떤 클라이언트의 요청에 응답을 하게 되면 해당 요청을 한 특정 클라이언트에게만 응답이 가는가요?
: 아니면 연결된 모든 클라이언트에게 다 응답이 가는가요?
: >> 답변: 녜 가능합니다.
: 일반적으로,
: 서버에 접속된 클라이언트 갯수만큼 for문을 돌면서
: 각 클라이언트에게 메시지를 보내게 코딩합니다.
:
: 5. 서버가 클라이언트의 메시지에 응답을 하는동안 현재 진행중인 제어에 부담이 되지는 않는지요??
: IndyTCPServer 가 자체적으로 쓰레드를 이용한다고 하는 것 같은데 실제 코딩은 Main 화면에서 메시지 이벤트 처리로 하고 있는듯 해서요..
: >> 답변: 클라이언트가 검~나게 많이 붙으면 부하를 받겠지요.
: 제가 사용해 본 경험으로는 몇백개까지도 무난했던 것 같습니다
: 실제 코드에서 얼마나 부하를 주나에 따라 다르겠지만
: 겨우, 2개 정도면 당연히 그런 걱정 안하셔도 됩듯합니다.
:
: *추가:
: 저도 최근에 JSON 관련해서 사용했는데
: 아직은 관련 클래스가 사용하기 많이 번거롭습니다.
: 특히 C++관련 예제 소스는 거의 없으니 더욱 그렇지요
:
: 아래 링크들을 참고해서 하나씩 알아가 보세요
:
https://chapmanworld.com/2015/01/18/json-with-radstudio-delphi-or-c-builder/
:
https://stackoverflow.com/questions/55568407/how-to-get-json-value-using-tjsonobject-class-in-c-builder
:
:
: 김시환 님이 쓰신 글 :
: : 지금껏 Local 상태로만 장비 제어 프로그램을 해 왔었는데 새로 장비를 개발 하면서 TCP/IP 를 통한 원격 제어 및 모니터링이 가능하게 해 달라는 요청을 받았습니다.
: :
: : 일단 IndyTCPServer 를 이용해서 개발을 하려고 합니다. 통신 프로토콜은 Json 을 사용합니다.
: : TCP/IP 원격 제어를 해 본적이 없어서 몇가지 의문점이 있어서 질문 드립니다.
: :
: : 1. client 가 2군데 이상에서 연결이 되었을 경우 이들을 구분할 수 있나요?
: : 예) master 권한과 단순 모니터링 참가자 ( 실제 제어 권한과 단순 모니터링 권한의 구분)
: :
: : 2. IndyTCPServer 를 잠시 테스트 했을 때 보니 보통 client에서 메시지를 보내면 그 메시지를 받고 OnExecute 에서 이벤트 처리로 응답을 보내게 되어 있던데 Client 에서 메시지를 받지 않는 상황에서 시스템 자체에서 현재 연결되어 있는 Client 들에게 특정 메시지를 보낼 수 있는지요?
: :
: : 3. (2) 번 문항과 같은 의미 일수 있는데 서버는 클라이언트의 요청에 의해서만 응답을 하는 것인가요?
: :
: : 4. OnExecute 이벤트에서 어떤 클라이언트의 요청에 응답을 하게 되면 해당 요청을 한 특정 클라이언트에게만 응답이 가는가요?
: : 아니면 연결된 모든 클라이언트에게 다 응답이 가는가요?
: :
: : 5. 서버가 클라이언트의 메시지에 응답을 하는동안 현재 진행중인 제어에 부담이 되지는 않는지요??
: : IndyTCPServer 가 자체적으로 쓰레드를 이용한다고 하는 것 같은데 실제 코딩은 Main 화면에서 메시지 이벤트 처리로 하고 있는듯 해서요..
: :
: : 시대가 변하니 장비제어도 자꾸 새로운 기술들을 접목해 달라고 요구하는데 나이는 먹어서 뭔가 새롭게 한다는게 참 부담스럽네요..
: : 그리고 indy 와 TJSONObject 관련한 자료는 죄다 델파이 뿐이라 파스칼 잘 모르는 제 입장에서는 하나하나 뜻어 분석하는게 얼렵네요.
: :
: :