C++ builder 网络聊天程序

#include <vcl.h>
#pragma hdrstop

#include "main.h"
//---------------------------------------------------------------------------
#pragma link "ScktComp"
#pragma resource "*.dfm"
TChatForm *ChatForm;
class TMyServerThread:public TServerClientThread
{
public:
        TMyServerThread(bool suspend,TServerClientWinSocket *socket):TServerClientThread(suspend,socket){}
    virtual void   __fastcall   TMyServerThread::ClientExecute(void) {
        //   make   sure   connection   is   active
        while   (!Terminated   &&   ClientSocket-> Connected) {
            try {
                //   Now,   use   TWinSocketStream   to   read   or   write   information
                //   over   a   blocking   socket   connection

                TWinSocketStream   *pStream   =   new   TWinSocketStream(ClientSocket,   60000);

                try {
                                        char   buffer[100];
                    memset(   buffer,   0,   sizeof(buffer)   );

                    //   give   the   client   60   seconds   to   start   writing
                    if   (pStream-> WaitForData(2000)) {
                        if   (pStream-> Read(buffer,   sizeof(buffer))   ==   0)
                        {
                            ClientSocket-> Close();
                                                }
                        else
                                                {
                            ChatForm-> Memo1-> Lines-> Add(AnsiString(buffer));
                        }

                    } else
                                                 ChatForm-> Memo1-> Lines-> Add(AnsiString( "等待数据超时"));
                }
                                catch(Exception &ex) /// Exception &ex
                                {
                                        Application->MessageBoxA(ex.Message.c_str(),"Error",0);
                                        delete   pStream;
                                }
                                delete pStream;
            } catch   (Exception &ex) {
                Application->MessageBoxA(ex.Message.c_str(),"Error",0);
            }
        }
    }
};
//---------------------------------------------------------------------------
__fastcall TChatForm::TChatForm(TComponent* Owner)
        : TForm(Owner)
{
        thread=0;
}
//---------------------------------------------------------------------------

void __fastcall TChatForm::FileListenItemClick(TObject *Sender)
{
  FileListenItem->Checked = !FileListenItem->Checked;
  if (FileListenItem->Checked)
  {
     ClientSocket->Active = false;
     ServerSocket->Active = true;
     StatusBar1->Panels->Items[0]->Text = "Listening...";
  }else
  {
     if (ServerSocket->Active)
     {
        ServerSocket->Active = false;
     }
     StatusBar1->Panels->Items[0]->Text = "";
  }
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::FileConnectItemClick(TObject *Sender)
{
  if (ClientSocket->Active)
  {
    ClientSocket->Active = false;
  }
  Server=InputBox("Computer to connect to", "Address Name:", "127.0.0.1");      //Server))
  //ClientSocket->Address
  //ClientSocket->Host = Server;
  ClientSocket->Address="127.0.0.1";
  ClientSocket->Open();
  //ClientSocket->Active = true;
  FileListenItem->Checked = false;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::Exit1Click(TObject *Sender)
{
  ServerSocket->Close();
  ClientSocket->Close();
  Close();   
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::Memo1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
  if (Key == VK_RETURN)
  {
     if (IsServer){ServerSocket->Socket->Connections[0]->SendText(
         Memo1->Lines->Strings[Memo1->Lines->Count - 1]); }
     else
     { ClientSocket->Socket->SendText(Memo1->Lines->Strings[
        Memo1->Lines->Count -1]);}
  }
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::FormCreate(TObject *Sender)
{
  //FileListenItemClick(NULL);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::ClientSocketConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
  StatusBar1->Panels->Items[0]->Text = "Connect to: " + Socket->RemoteHost;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::Disconnect1Click(TObject *Sender)
{
  ClientSocket->Active = false;
  ServerSocket->Active = true;
  StatusBar1->Panels->Items[0]->Text = "Listening...";
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::ClientSocketRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  Memo2->Lines->Add(Socket->ReceiveText());
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::ServerSocketClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
  Memo2->Lines->Add(Socket->ReceiveText());
  OutputDebugString("******************ServerSocketClientRead event*********************");
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::ServerSocketAccept(TObject *Sender,
      TCustomWinSocket *Socket)
{
  IsServer = true;
  OutputDebugString("******************ServerSocketAccept***************************");
  //TServerWinSocket *socket=ServerSocket->Socket;
  StatusBar1->Panels->Items[0]->Text = "Connect to: " + Socket->RemoteAddress;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::ServerSocketClientConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
  Memo2->Lines->Clear();
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::ClientSocketDisconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
  FileListenItemClick(NULL);   
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::ClientSocketError(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
  Memo2->Lines->Add("Error connecting to:" + Server);
  ErrorCode = 0;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::ServerSocketClientDisconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
        thread->Terminate();
        thread=0;
        StatusBar1->Panels->Items[0]->Text = "Listening...";
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TChatForm::OnGetThread(TObject *Sender,
      TServerClientWinSocket *ClientSocket,
      TServerClientThread *&SocketThread)
{
      SocketThread=new TMyServerThread(false,ClientSocket);
      thread= SocketThread;
}
//---------------------------------------------------------------------------
void __fastcall TChatForm::OnWindowClose(TObject *Sender,
      TCloseAction &Action)
{
      ServerSocket->Close();
      if(thread!=0)
        thread->Terminate();
}
//---------------------------------------------------------------------------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值