|
장성호 님이 쓰신 글 :
: 좀 어렵게 하시네요
:
: TClientSocket , TServerSocket은?
: 타입이 Blocking 모드 보다 NonBlocking 모드가 코딩이 간편하고
: 더 잘맞는것 같습니다.
: 대개 TClientSocket , TServerSocket 은 NonBlocking 모드로 대게 쓰구요..
:
: ...
:
: 간단하게..
: 둘다 NonBlocking 으로 설정하시구요
:
: 서버는 OnClientRead이벤트 함수에서
: ServerSocket1ClientRead 읽으시면 되구요
:
: 클라이언트는 OnRead이벤트에서 읽으시면 됩니다. ClientSocket1Read
:
:
: void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
: TCustomWinSocket *Socket)
: {
: String str=Socket->ReceiveText();
: Memo1->Lines->Add(str);
: }
: //---------------------------------------------------------------------------
:
: void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
: TCustomWinSocket *Socket)
: {
: String str=Socket->ReceiveText();
: Memo1->Lines->Add(str);
: }
: //---------------------------------------------------------------------------
:
:
: 그럼..
:
:
: mister 님이 쓰신 글 :
: : 제가 BCB4로 처음 시도를 해 보는데요..
: : client와 sever 간에 처음 접속은 되더군요..
: : OnAccept, OnConnect 이벤트는 서버쪽에서 알아 듣습니다. 하지만 OnGetThread는 전혀 알아 듣지 못하네요..
: : 그리고 client쪽에서 ClientSocket->SenText("~~~~")를 해주면 Server쪽에선 OnGetSocket 쪽에서 처리를 해 줘야
: : 하나요.. help에서는 소켓 쓰레드와 스트림을 쓰던데 그 방법대로 해도 OnGetThread가 안되고요..
: : 클라이언트에서 값을 pStream->Write(~~~)하면 몇번을 쓰고 멈춰 버리더군요..
: :
: :
: : 강좌나 질답을 검색해도, 제가 처음이라 안되네요.. 소스를 올려보겠습니다.
: : 잘못된 부분이나 추가 해야 할 사항이 있으면 알려주세요..
: : 간단하게 문자를 주고 받는 정도만 이해 하면 됩니다.
: :
: :
: :
: : //-------------------- 클라이언트 쪽 -------------------------------
: :
: : //접속 버튼 입니다.
: : void __fastcall TForm1::Button1Click(TObject *Sender)
: : {
: : if (ClientSocket1->Active)
: : {
: : ClientSocket1->Active = false;
: : Sleep(1000);
: : }
: :
: :
: :
: : try
: : {
: : ClientSocket1->ClientType = ctBlocking;
: : ClientSocket1->Host = "192.168.10.125";
: : ClientSocket1->Port = 8080;
: : ClientSocket1->Active = true;
: : ShowMessage(" ++ Server 에 접속합니다. ++ ");
: : }
: : catch ( ... )
: : {
: : ShowMessage(" ++ Server 접속에 실패 했습니다, 서버를 실행해 주세요 ! ++ ");
: : }
: : }
: :
: : //OnConnect 이벤트
: : void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
: : TCustomWinSocket *Socket)
: : {
: : cliSocket = Socket;
: : Memo1->Lines->Append("Client Connect to Server");
: :
: : }
: : //
: :
: : //메시지를 보내는 부분입니다.
: : void __fastcall TForm1::SendSocket()
: : {
: : char sendBuffer[BUFFERSIZE];
: : char buffer[BUFFERSIZE];
: : bool bCompleted = false;
: : memset(sendBuffer, '\0', BUFFERSIZE);
: :
: : while (!bCompleted && cliSocket->Connected)
: : {
: : try
: : {
: : TWinSocketStream* pStream = new TWinSocketStream(cliSocket, CLIENTWAITTIME);
: :
: : try
: : {
: : //서버로 보내고
: : memset(buffer, '\0', BUFFERSIZE);
: : memset(sendBuffer, '\0', BUFFERSIZE);
: : Form1->Memo1->Lines->Append("Send to Serever");
: : strcpy(sendBuffer, "Client Message!");
: : pStream->Write(sendBuffer, strlen(sendBuffer));
: :
: : //받으려 합니다.
: : if (pStream->WaitForData(CLIENTWAITTIME))
: : {
: : Form1->Memo1->Lines->Append("receive data");
: : if (pStream->Read(buffer, BUFFERSIZE) == 0)
: : cliSocket->Close();
: : else
: : {
: : Form1->Memo2->Lines->Append(AnsiString(buffer));
: : Form1->Memo2->Lines->Append("receive Message");
: :
: : bCompleted = true;
: : //code here
: : }
: : }
: : else
: : {
: : Form1->Memo1->Lines->Append("wait fail");
: : cliSocket->Close();
: : }
: : }
: : __finally
: : {
: : delete pStream;
: : }
: : }
: : catch (...)
: : {
: : Memo1->Lines->Append("Fail Stream");
: : }
: : }
: :
: : if(cliSocket->Connected)
: : {
: : cliSocket->Close();
: : }
: :
: :
: : }
: :
: : //------------------------------- 서버 쪽---------------------------------------
: :
: : //Thread
: : void __fastcall TForm1::ServerSocket1GetThread(TObject *Sender,
: : TServerClientWinSocket *ClientSocket,
: : TServerClientThread *&SocketThread)
: : {
: : SocketThread = new TMyServerThread(false, ClientSocket);
: : }
: : //
: :
: :
: : //처리 부분
: :
: :
: :
: : void __fastcall TMyServerThread::ClientExecute(void)
: : {
: : char sendBuffer[BUFFERSIZE];
: : char buffer[BUFFERSIZE];
: :
: : while (!Terminated && ClientSocket->Connected)
: : {
: : Form1->Memo2->Lines->Append("recieve message");
: :
: : try
: : {
: : TWinSocketStream* pStream = new TWinSocketStream(ClientSocket, CLIENTWAITTIME);
: :
: : try
: : {
: : memset(sendBuffer, '\0', BUFFERSIZE);
: : memset(buffer, '\0', BUFFERSIZE));
: :
: : if (pStream->WaitForData(CLIENTWAITTIME))
: : {
: : Form1->Memo1->Lines->Append("receive data");
: : if (pStream->Read(buffer, BUFFERSIZE) == 0)
: : ClientSocket->Close();
: : else
: : {
: : Form1->Memo2->Lines->Append(AnsiString(buffer));
: : Form1->Memo1->Lines->Append("Send to Client");
: : strcpy(sendBuffer, "receive ok");
: : pStream->Write(sendBuffer, strlen(sendBuffer));
: : memset(buffer, '\0', BUFFERSIZE);
: :
: : //code here
: : }
: : }
: : else
: : {
: : Form1->Memo1->Lines->Append("wait fail");
: : ClientSocket->Close();
: : }
: : }
: : __finally
: : {
: : delete pStream;
: : }
: : }
: : catch (...)
: : {
: : HandleException();
: : }
: :
: : }
: : }
^^ 네 비동기식은 잘 되네요 감사합니다.
아쉬운것은 제가 올렸던 소스에서의 지적이 없네요... 혹시 조언 있으시면 답변 부탁 드립니다.
|