我写了一套网络通信程序,但是有问题,请大家帮忙看一下!
我想在客户端的文本框中输入要下载的文件名,然后点击按钮,
如果该文件在服务器端存在的话,就下载。还可以在服务器端的一
文本框中输入一个目录(如C:\WINDOWS)点击按钮,如果该目录在
客户端存在,就可以在listbox1 中显示在目录下的内容。
代码如下:
1。服务器程序的代码:
void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,
TCustomWinSocket *Socket)
{
ShowMessage("客户端已经连入");
StatusBar1->Panels->Items[0]->Text="客户端已经连入";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString rcommand,rFile,Msg;
Msg=Socket->ReceiveText();
rcommand=Msg.SubString(1,5);//分解信息头
if(rcommand=="FILE_")
{
rFile=Msg.SubString(6,Msg.Length()-5);//分解文件名
if(FileExists(rFile))
{
Socket->SendText(rcommand);
TFileStream *filestream=
new TFileStream(rFile,fmOpenRead|fmShareDenyWrite);
Socket->SendStream(filestream);
filestream->Free();
}
}
else if(rcommand=="LIST_")
{
ListBox1->Items->Text=Socket->ReceiveText();
Label1->Caption=Edit1->Text;
}
else
Memo1->Text = Memo1->Text +Msg;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
ShowMessage("客户端已经断开连接");
StatusBar1->Panels->Items[0]->Text="客户端已断开连接";
Memo1->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString Msg;
Msg="LIST_"+Edit1->Text;//构造请求信息
ServerSocket1->Socket->SendText(Msg);
}
//---------------------------------------------------------------------------
2。客户端程序:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String server;
if(ClientSocket1->Active)
ClientSocket1->Close();
if(InputQuery("我的计算机连接到……","连接地址",server))
{
if(server.Length()>0)
{ClientSocket1->Host=server;
ClientSocket1->Open();
Button2->Enabled=true;
Button3->Enabled=true;
Button4->Enabled=true;
Edit1->Enabled=true;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
ClientSocket1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
if(Edit1->Text!="")
{
if(SaveDialog1->Execute())
{
FileName=SaveDialog1->FileName;
AnsiString Msg;
Msg="FILE_"+Edit1->Text;//构造请求信息
ClientSocket1->Socket->SendText(Msg);
}
}
else ShowMessage("请输入要下载的文件名");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
int n;
AnsiString Header,rcommand,rFile;
void *Buf;
TMemoryStream *tmpStream;
Header=Socket->ReceiveText();
rcommand=Header.SubString(1,5);
if(rcommand=="LIST_")
{
if(DirectoryExists(rFile))
{
Socket->SendText(rcommand);
FileListBox1->Directory=rFile;
Socket->SendText(FileListBox1->Items->Text);
}
}
else
switch(ClientStatus)
{
case csWait:
if(Header=="FILE_")
ClientStatus=csFile;
break;
case csFile:
tmpStream=new TMemoryStream();
Screen->Cursor=crHourGlass;
do{
n=Socket->ReceiveBuf(Buf,sizeof(Buf));
if(n<=0)
{ShowMessage("数据传输完毕");
break;}
else
tmpStream->Write(Buf,n);
Sleep(200);
}while(true);
tmpStream->SaveToFile(FileName);
delete tmpStream;
Screen->Cursor=crDefault;
ClientStatus=csWait;
MessageBox(Handle,"下载完毕!","网络通信程序",MB_OK);
}
}
//---------------------------------------------------------------------------
一运行就说什么API ‘send’出错。这是怎么回事啊!