各位大大好 小弟寫了一個有登入和註冊功能的聊天室
再傳輸和接收訊息上有一點問題 就是我要按一個Button用三個ClientSocket傳三個訊息給Server端
可是為什麼我要按三次才能完成這些動作 P.S.粗體部分是我程式傳輸和接收有問題的片段(我個人認為的) 以下是我的程式
**************************Server端***************************
//--------------------------------------------------------------------
////////////////////////(Unit1.h)/////////////////////////////
#include
#include "jpeg.hpp"
#pragma hdrstop #include "Unit1.h"
//--------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TServer *Server;
int i=0,j=0;
AnsiString id,pw,login=12;
//--------------------------------------------------------------------
__fastcall TServer::TServer(TComponent* Owner)
: TForm(Owner)
{
Image1->Picture->LoadFromFile("bird002.jpg");
RichEdit1->Clear();
}
//--------------------------------------------------------------------
void __fastcall TServer::Button1Click(TObject *Sender)
{
ServerSocket->Active = true ;
ServerSocket1->Active = true ;
ServerSocket2->Active = true ;
ServerSocket3->Active = true ;
ServerSocket4->Active = true ;
ServerSocket5->Active = true ;
ServerSocket6->Active = true ;
ServerSocket7->Active = true ;
StatusBar1->SimpleText = "Listening ..." ;
Button1->Enabled = false ;
Button2->Enabled = true ;
}
//--------------------------------------------------------------------
void __fastcall TServer::Button2Click(TObject *Sender)
{
AnsiString buf;
int j;
for(j=0;jSocket->Connections[j]->RemoteAddress "\tDisconnected.";
RichEdit1->Lines->Add(buf);
}
ServerSocket->Active = false ;
ServerSocket1->Active = false ;
ServerSocket2->Active = false ;
ServerSocket3->Active = false ;
ServerSocket4->Active = false ;
ServerSocket5->Active = false ;
ServerSocket6->Active = false ;
ServerSocket7->Active = true ;
Button1->Enabled = true ;
Button2->Enabled = false ;
i=0;
StatusBar1->SimpleText = IntToStr(i) " Client Connected...."; }
//--------------------------------------------------------------------
void __fastcall TServer::ServerSocketClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{ AnsiString buf; //Client與Server連線上所要做的事情
//將Server收到連線需求的Log Post一份在Memo上
buf = DateTimeToStr(Now());
buf = " " Socket->RemoteAddress "\tConnected.";
RichEdit1->Lines->Add(buf);
i ;
StatusBar1->SimpleText = "Connected from: " Socket->RemoteAddress ;
Sleep(1000);
StatusBar1->SimpleText = IntToStr(i) " Client Connected....";
}
//--------------------------------------------------------------------
void __fastcall TServer::ServerSocketClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString buf;
//Client與Server斷線時所要做的動作
buf = DateTimeToStr(Now());
buf = " " Socket->RemoteAddress "\tDisconnected.";
RichEdit1->Lines->Add(buf);
i--;
StatusBar1->SimpleText = "Disconnected from: " Socket->RemoteAddress ;
Sleep(1000);
StatusBar1->SimpleText = IntToStr(i) " Client Connected....";
}
//--------------------------------------------------------------------
void __fastcall TServer::ServerSocketClientError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
StatusBar1->SimpleText = "Error from Client socket.";
}
//--------------------------------------------------------------------
void __fastcall TServer::ServerSocketClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString text;
int j;
StatusBar1->SimpleText = "Message from: " Socket->RemoteAddress;
text = Socket->ReceiveText() ;
for(j=0;jSocket->Connections[j]->SendText(text);
}
}
//--------------------------------------------------------------------
void __fastcall TServer::ServerSocketListen(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->SimpleText = "Server Listen" ;
}
//--------------------------------------------------------------------
void __fastcall TServer::ServerSocket1ClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
TMemoryStream *msFile=new TMemoryStream;
msFile->LoadFromFile("bird002.jpg");
MYPACK mp;
int j=0,k;
int block=(msFile->Size%MAX_DATASIZE==0)?
msFile->Size/MAX_DATASIZE: msFile->Size/MAX_DATASIZE 1; for(j=0; jSize;
mp.dwThisDataSize=((j 1)*MAX_DATASIZE>msFile->Size)?
msFile->Size-j*MAX_DATASIZE: MAX_DATASIZE;
msFile->Position=j*MAX_DATASIZE;
msFile->Read(mp.pbThisData, mp.dwThisDataSize); ServerSocket1->Socket->Connections[i-1]->SendBuf(&mp, sizeof(MYPACK)); Sleep(10); }
delete msFile; }
//--------------------------------------------------------------------
void __fastcall TServer::ServerSocket2ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString ClientName;
int k;
ClientName = Socket->ReceiveText() ;
for(k=0;kSocket->Connections[k]->SendText(ClientName) ;;
}
}
//--------------------------------------------------------------------
void __fastcall TServer::ServerSocket4ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
pw = Socket->ReceiveText(); }
//--------------------------------------------------------------------
void __fastcall TServer::ServerSocket3ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
id = Socket->ReceiveText(); }
//--------------------------------------------------------------------
void __fastcall TServer::ServerSocket5ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString test;
login=12;
login = Socket->ReceiveText(); if(login==0)
{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->Parameters->CreateParameter("checkID",ftString,pdInput,30,id);
ADOQuery1->Parameters->CreateParameter("checkPassword",ftString,pdInput,30,pw);
ADOQuery1->SQL->Add("Select * From 資料表1 Where ID=:checkID and Password=:checkPassword");
ADOQuery1->Open(); if(ADOQuery1->RecordCount==1)
{
test="登入成功";
ServerSocket7->Socket->Connections[j-1]->SendText(test);
ServerSocket6->Socket->Connections[j-1]->SendText(test);
}
else
{
test="登入失敗";
ServerSocket7->Socket->Connections[j-1]->SendText(test);
ServerSocket6->Socket->Connections[j-1]->SendText(test);
}
}
else if(login == 1)
{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->Parameters->CreateParameter("checkID",ftString,pdInput,30,id);
ADOQuery1->Parameters->CreateParameter("checkPassword",ftString,pdInput,30,pw);
ADOQuery1->SQL->Add("Select * From 資料表1 Where ID=:checkID");
ADOQuery1->Open();
if(ADOQuery1->RecordCount==1)
{
test="此帳號有人使用";
ServerSocket7->Socket->Connections[j-1]->SendText(test);
ServerSocket6->Socket->Connections[j-1]->SendText(test);
}
else
{
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->Parameters->CreateParameter("checkID",ftString,pdInput,30,id);
ADOQuery1->Parameters->CreateParameter("checkPassword",ftString,pdInput,30,pw);
ADOQuery1->SQL->Add("Insert Into 資料表1 Values(:checkID,:checkPassword)");
ADOQuery1->ExecSQL();
test="此帳號註冊成功";
ServerSocket7->Socket->Connections[j-1]->SendText(test);
ServerSocket6->Socket->Connections[j-1]->SendText(test);
}
}
else
{
test="無登入和註冊(遊客)";
ServerSocket7->Socket->Connections[j-1]->SendText(test);
ServerSocket6->Socket->Connections[j-1]->SendText(test);
} }
//--------------------------------------------------------------------
void __fastcall TServer::ServerSocket5ClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
j=j 1; }
//--------------------------------------------------------------------
void __fastcall TServer::ServerSocket5ClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
j=j-1;
}
//-------------------------------------------------------------------- **************************Client端*****************************
//-------------------------------------------------------------------- #include
#include
#pragma hdrstop #include "Unit1.h"
#include "Unit2.h"
TMemoryStream *gmsFile=NULL;
//--------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int i=0; //--------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
gmsFile=new TMemoryStream;
RichEdit1->Clear();
Label4->Caption="";
}
//-------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString status;
if(Edit2->Text != "")
{
ClientSocket->Host = Edit2->Text;
ClientSocket1->Host = Edit2->Text;
ClientSocket2->Host = Edit2->Text;
ClientSocket3->Host = Edit2->Text;
if (Button1->Caption == "Connect")
{
ClientSocket3->Active = true ;
Form2->ShowModal();
status = ClientSocket3->Socket->ReceiveText();
Label4->Caption = status;
ClientSocket3->Active = false ;
try
{
ClientSocket->Active = true ;
ClientSocket1->Active = true ;
ClientSocket2->Active = true ;
StatusBar1->SimpleText = "Connecting ..." ;
}
__finally
{
Button1->Caption = "Disconnect" ;
}
}
else
{
ClientSocket->Active = false ;
ClientSocket1->Active = false ;
ClientSocket2->Active = false ;
Label4->Caption = "";
Edit2->Text="";
StatusBar1->SimpleText = "Disconnect" ;
Button1->Caption = "Connect" ;
}
}
else
ShowMessage("請輸入伺服器IP");
}
//--------------------------------------------------------------------
void __fastcall TForm1::txtSendKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if (StrToInt(Key) == 13 )
{
if(txtSend->Text == "" && Edit1->Text == "")
{
ShowMessage("請輸入傳輸文字及使用者名稱");
}
else if(txtSend->Text == "")
{
ShowMessage("請輸入傳輸文字");
}
else if(Edit1->Text == "")
{
ShowMessage("請輸入使用者名稱");
txtSend->Text = "";
}
else
{
AnsiString buf,ClientName;
ClientName = Edit1->Text;
ClientSocket2->Socket->SendText(ClientName);
buf = Edit1->Text "-->" txtSend->Text;
ClientSocket->Socket->SendText(buf);
txtSend->Text = "";
}
} }
//--------------------------------------------------------------------
void __fastcall TForm1::ClientSocketConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->SimpleText = "Connected to: " Socket->RemoteHost;
}
//--------------------------------------------------------------------
void __fastcall TForm1::ClientSocketConnecting(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->SimpleText = "Connecting to: " Socket->RemoteHost;
}
//--------------------------------------------------------------------
void __fastcall TForm1::ClientSocketDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->SimpleText = "Disconnect from: " Socket->RemoteHost;
Button1->Caption = "Connect" ;
}
//--------------------------------------------------------------------
void __fastcall TForm1::ClientSocketError(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
StatusBar1->SimpleText = "Socket Error" ;
Button1->Caption = "Connect" ;
}
//--------------------------------------------------------------------
void __fastcall TForm1::ClientSocketRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString Retext,ReUserName;
ReUserName = ClientSocket2->Socket->ReceiveText();
if(ReUserName == Edit1->Text)
{
RichEdit1->SelAttributes->Color = clRed;
}
Retext = ClientSocket->Socket->ReceiveText();
RichEdit1->Lines->Add(Retext);
RichEdit1->SelAttributes->Color = clGreen;
}
//-------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if(gmsFile) delete gmsFile;
}
//-------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
MYPACK mp; lstrcpy(mp.szFileName,"bird002.jpg");
Socket->ReceiveBuf(&mp, sizeof(MYPACK)); AnsiString sz=(AnsiString)mp.szHeader;
if(sz.SubString(1, 4)=="FILE")
{
if(sz=="FILE-START")
{
gmsFile->Size=mp.dwTotalDataSize;
gmsFile->Position=0;
}
gmsFile->Write(mp.pbThisData, mp.dwThisDataSize);
if(sz=="FILE-END")
{
gmsFile->Position=0;
gmsFile->SaveToFile(mp.szFileName);
gmsFile->Clear();
Image1->Picture->LoadFromFile("bird002.jpg");
}
}
}
//-------------------------------------------------------------------- void __fastcall TForm1::ClientSocket3Read(TObject *Sender,
TCustomWinSocket *Socket)
{
;
}
//--------------------------------------------------------------------
/////////////////////////////(Unit2.h)//////////////////////////
//--------------------------------------------------------------------
#include
#pragma hdrstop #include "Unit2.h"
#include "Unit1.h"
//--------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
AnsiString test="";
//--------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
AnsiString buf,buf1,in;
ClientSocket1->Host = Form1->Edit2->Text;
ClientSocket2->Host = Form1->Edit2->Text;
ClientSocket3->Host = Form1->Edit2->Text;
ClientSocket4->Host = Form1->Edit2->Text;
ClientSocket1->Active = true;
ClientSocket2->Active = true;
ClientSocket3->Active = true;
ClientSocket4->Active = true; in = 0;
buf=Edit1->Text;
buf1=Edit2->Text;
ClientSocket1->Socket->SendText(buf);
ClientSocket2->Socket->SendText(buf1);
ClientSocket3->Socket->SendText(in);
test=ClientSocket4->Socket->ReceiveText();
//Label3->Caption=test;
if(test!="")
{
Edit1->Text="";
Edit2->Text="";
ClientSocket1->Active = false;
ClientSocket2->Active = false;
ClientSocket3->Active = false;
ClientSocket4->Active = false;
Form2->Close();
}
}
//--------------------------------------------------------------------
void __fastcall TForm2::Button2Click(TObject *Sender)
{
AnsiString buf,buf1,in;
ClientSocket1->Host = Form1->Edit2->Text;
ClientSocket2->Host = Form1->Edit2->Text;
ClientSocket3->Host = Form1->Edit2->Text;
ClientSocket4->Host = Form1->Edit2->Text;
ClientSocket1->Active = true;
ClientSocket2->Active = true;
ClientSocket3->Active = true;
ClientSocket4->Active = true;
in = 1;
buf=Edit1->Text;
buf1=Edit2->Text;
ClientSocket1->Socket->SendText(buf);
ClientSocket2->Socket->SendText(buf1);
ClientSocket3->Socket->SendText(in);
test=ClientSocket4->Socket->ReceiveText();
//Label3->Caption=test;
if(test!="")
{
Edit1->Text="";
Edit2->Text="";
ClientSocket1->Active = false;
ClientSocket2->Active = false;
ClientSocket3->Active = false;
ClientSocket4->Active = false;
Form2->Close();
} }
//--------------------------------------------------------------------
void __fastcall TForm2::Button3Click(TObject *Sender)
{
AnsiString in;
ClientSocket3->Host = Form1->Edit2->Text;
ClientSocket4->Host = Form1->Edit2->Text;
ClientSocket3->Active = true;
ClientSocket4->Active = true;
in = 2;
ClientSocket3->Socket->SendText(in);
test=ClientSocket4->Socket->ReceiveText();
//Label3->Caption=test;
if(test!="")
{
Edit1->Text="";
Edit2->Text="";
ClientSocket3->Active = false;
ClientSocket4->Active = false;
Form2->Close();
}
}
//--------------------------------------------------------------------
void __fastcall TForm2::ClientSocket4Read(TObject *Sender,
TCustomWinSocket *Socket)
{
//test=Socket->ReceiveText();
//Label3->Caption=test;
}
//--------------------------------------------------------------------