C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[5373] Re:빌러 소켓컴포넌트 사용에서..
홍용혁 [] 2729 읽음    2001-02-12 21:05
FEELHACK 님이 쓰신 글 :
: 빌더의 소켓 컴포넌트를 사용해서 간단한 메세지를 전송하려고 하는데요.

: 클라이언트 에서 T = Edit1->Text;
: Socket->SendText(T);

: 이렇게 해서 메세지를 보내고요 (Client OnRead 에서요..)

: 서버플그램에서

: R =  Socket->ReceiveText();
: Edit1->Text = R;

: 이건 (Server OnRead 에서요..)

: 소켓마다 포트,IP, 다 지정하고 Active 시켰는데요..

: 두 프로그램을 실행시켜보면 분명 클라이언트가 서버에 접속이 霓되었는데요
: (OnClientConnect 에다가 Label1->Caption = "Connect" 를 넣어서 확인)

: 메세지가 안오네요..;;
: 원래대로라면 서버프로그램의 Edit1->Text 에 클라의 Edit1->Text 에
: 입력된 메세지가 와야되는거 아닌가요.;;

: 어떤 과정이 빠졌는지 알려주시면 감사하겠스니다.

: 참. 그리고 서버와 클라이언트간의 SendText , RecevieText 는
: 여러개가 보내지지 않나요?
: RecevieText 에 인자가 없으니.. 클라에서
: SendText(A); SendText(B)
: 이렇게 두개를 보내게 되면 어떤걸 받게 되는지요..;;

: 다변 부탁드립니다.                      
:

보통 클라이언트에서 Edit 박스에 어떤 내용을 입력한것을 엔터를 치면 서버에 전송합니다.

void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
    if(Key==VK_RETURN)
    {
        ClientSocket1->Socket->SendText(Edit1->Text);
    }
}
//---------------------------------------------------------------------------

그런데 Client 의 OnRead 이벤트에서 메세지를 보낸다면????

넘어오는 Socket 인자는 서버소켓입니다.

만약 다음과 같이 하면 안됩니다.

void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
    Socket->SendText(Edit1->Text);
}

클라이언트에서 서버로 메세지를 보낼때는

ClientSocket1->Socket->SendText 이런식으로 하여야 하죠.

그리고 클라이언트의 OnRead 이벤트에서는 일반적으로 메세지를 보내는 것이 아니라

서버에서 받은 메세지를 자신의 폼에 뿌려줍니다.

그리고 SendText 를 할때마다 OnRead 이벤트핸들러 발생하므로

여러개를 보낸다고 해도 걱정 없습니다.

클라이언트에서 여러번 메세지를 보내더라도

서버에서 여러번 OnRead 이벤트핸들러가 발생할뿐입니다.



1. 클라이언트에서 서버로 메세지를 보낼때

//--- 클라이언트---
void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
    if(Key==VK_RETURN)
    {
        ClientSocket1->Socket->SendText(Edit1->Text);
    }
}


//--- 서버 ---
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
    String str;
    str=Socket->ReceiveText();
    Memo1->Lines->Add(str);
}


2. 서버에서 클라이언트로 메세지를 보낼때

//--- 서버 ---
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
    ServerSocket1->Socket->Connections[0]->SendText(Edit1->Text);   
}

//--- 클라이언트 ---
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
    String str;
    str=Socket->ReceiveText();
    Memo1->Lines->Add(str);
}



+ -

관련 글 리스트
5371 빌러 소켓컴포넌트 사용에서.. FEELHACK 2615 2001/02/12
5373     Re:빌러 소켓컴포넌트 사용에서.. 홍용혁 2729 2001/02/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.