#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();
}
//---------------------------------------------------------------------------