服务器端:server.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString NowlogName="";
AnsiString NowlogHost="";
AnsiString NowlogAddress="";
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Memo1->Clear();
ListBox1->Clear();
ListBox2->Clear();
ListBox3->Clear();
ServerSocket1->Active=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
Memo1->Clear();
ListBox1->Clear();
ListBox2->Clear();
ListBox3->Clear();
AnsiString SysInfo;
SysInfo="["+TimeToStr(Now())+"]"+" 与服务器失去连接!请重新连接!";
int M=0;
M=ServerSocket1->Socket->ActiveConnections;
for(int i=0;i<M;i++)
{
ServerSocket1->Socket->Connections[i]->SendText(SysInfo);
}
ServerSocket1->Active=false;
ServerSocket1->Close();
Form1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
NowlogHost=Socket->RemoteHost;
NowlogAddress=Socket->RemoteAddress;
AnsiString Data=Socket->ReceiveText(); //接收用户发送的信息
AnsiString SubData1=Data.SubString(Data.Length()-7,8); //分析信息
AnsiString SubData2=Data.SubString(1,Data.Length()-8);
if(SubData1=="@login@@") //如果是用户登陆的信息
{
ListBox1->Items->Add(SubData2); //用户信息加入到用户列表
ListBox2->Items->Add(NowlogAddress);
ListBox3->Items->Add(NowlogHost);
AnsiString SysInfo="["+TimeToStr(Now())+"]"+SubData2+" 加入了会议!";//显示系统信息
Memo1->Lines->Add(SysInfo);
if(ServerSocket1->Socket->ActiveConnections)
for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
// ServerSocket1->Socket->Connections[i]->SendText(SubData2+"@login@@");
ServerSocket1->Socket->Connections[i]->SendText("@login@@"+SubData2+"@"+NowlogHost+"@"+NowlogAddress);
}
else if(SubData1=="@logout@") //如果是用户退出会议
{
int Index1=ListBox1->Items->IndexOf(SubData2); //从用户列表中删除该用户信息
ListBox1->Items->Delete(Index1);
int Index2=ListBox2->Items->IndexOf(NowlogAddress);
ListBox2->Items->Delete(Index2);
int Index3=ListBox3->Items->IndexOf(NowlogHost);
ListBox3->Items->Delete(Index3);
Memo1->Lines->Add("["+TimeToStr(Now())+"]"+SubData2+" 退出了会议!"); //显示系统信息
if(ServerSocket1->Socket->ActiveConnections)
for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
// ServerSocket1->Socket->Connections[i]->SendText(SubData2+"@logout@");
ServerSocket1->Socket->Connections[i]->SendText("@logout@"+SubData2+"@"+NowlogHost+"@"+NowlogAddress);
}
else
{
Data="["+TimeToStr(Now())+"]"+Data; //加入系统时间
Memo1->Lines->Add(Data);
//向所有用户转发信息
if(ServerSocket1->Socket->ActiveConnections)
for(int i=0;i<ServerSocket1->Socket->ActiveConnections;i++)
ServerSocket1->Socket->Connections[i]->SendText(Data);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Memo1Change(TObject *Sender)
{
if(Memo1->Lines->Count>=100)
Memo1->Lines->Clear();
}
//---------------------------------------------------------------------------
客户端:client.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "iostream.h"
#include "io.h"
#include "time.h"
#include "stdio.h"
#include "alloc.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString yourName="yourName";
AnsiString IP="255.255.255.0";
AnsiString HostName="";
AnsiString NowlogName="";
AnsiString NowlogHost="";
AnsiString NowlogAddress="";
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Memo1->Clear();
Memo2->Clear();
Memo3->Clear();
Memo4->Clear();
BitBtn6->Enabled=false;
Edit1->Text="";
Edit2->Text="dy-02";
StaticText1->Caption="";
StaticText5->Caption="";
StaticText6->Caption="";
StaticText7->Caption="";
Panel1->Caption="私聊对象:" ;
//---------------------------------------
//获取本地IP地址及主机名
WORD wVersionRequested;
WSADATA wsaData;
//Start up WinSock
wVersionRequested = MAKEWORD(1, 1);
WSAStartup(wVersionRequested, &wsaData);
hostent *p;
char s[128];
char *p2;
//Get the computer name
gethostname(s, 128);
p = gethostbyname(s);
StaticText5->Caption=p->h_name;
//Get the IpAddress
p2 = inet_ntoa(*((in_addr *)p->h_addr));
StaticText6->Caption=p2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn4Click(TObject *Sender)
{
Memo3->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
Memo1->Clear();
}
//---------------------------------------------------------------------------
//连接服务器
void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->SimpleText="成功连接到服务器"+ClientSocket1->Host;;
ClientSocket1->Socket->SendText(yourName+"@login@@");
StaticText7->Caption=DateToStr(Now())+" "+Time();
}
//---------------------------------------------------------------------------
//发送信息
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
if(Memo2->Lines->Text=="")
Application->MessageBox("错误, 不能发空信息!","提示",MB_OK);
else
{
AnsiString Data;
Data=yourName+":"+Memo2->Lines->Text;
ClientSocket1->Socket->SendText(Data);
// Memo1->Lines->Add(Data);
Memo2->Lines->Clear();
Memo2->SetFocus();
}
}
//---------------------------------------------------------------------------
//接收服务器发送过来的信息
void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
int i=0;
AnsiString ch="";
NowlogName="";
NowlogHost="";
NowlogAddress="";
AnsiString Data=Socket->ReceiveText(); //接收用户发送的信息
AnsiString SubData1=Data.SubString(1,8); //分析信息
if(SubData1=="@login@@") //如果是用户登陆的信息
{
for(i=9;(ch=Data.SubString(i,1))!="@";i++)
NowlogName+=ch;
for( ;(ch=Data.SubString(i+1,1))!="@";i++)
NowlogHost+=ch;
NowlogAddress=Data.SubString(i+1,18);
ListBox1->Items->Add(NowlogName); //用户信息加入到用户列表
ListBox2->Items->Add(NowlogAddress);
ListBox3->Items->Add(NowlogHost);
AnsiString SysInfo="["+TimeToStr(Now())+"] "+NowlogName+" 加入了会议!";//显示系统信息
Memo1->Lines->Add(SysInfo);
}
else if(SubData1=="@logout@") //如果是用户退出会议
{
for(i=9;(ch=Data.SubString(i,1))!="@";i++)
NowlogName+=ch;
for( ;(ch=Data.SubString(i+1,1))!="@";i++)
NowlogHost+=ch;
NowlogAddress=Data.SubString(i+1,18);
int Index1=ListBox1->Items->IndexOf(NowlogName); //从用户列表中删除该用户信息
ListBox1->Items->Delete(Index1);
int Index2=ListBox2->Items->IndexOf(NowlogAddress);
ListBox2->Items->Delete(Index2);
int Index3=ListBox3->Items->IndexOf(NowlogHost);
ListBox3->Items->Delete(Index3);
Memo1->Lines->Add("["+TimeToStr(Now())+"] "+NowlogName+" 退出了会议!"); //显示系统信息
}
else
Memo1->Lines->Add(Data);
}
//---------------------------------------------------------------------------
//私聊空间或传送文件选定对象
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
if(ClientSocket2->Active)
{
ClientSocket2->Active=false;
ClientSocket2->Close();
}
int Index=ListBox1->ItemIndex;
IP=ListBox2->Items->Strings[Index];
HostName=ListBox3->Items->Strings[Index];
Panel1->Caption="私聊对象:"+ListBox1->Items->Strings[Index];
StaticText1->Caption=ListBox1->Items->Strings[Index];
ClientSocket2->Host=HostName;
ClientSocket2->Address=IP;
ClientSocket2->Port=2222;
ClientSocket2->Active=true;
BitBtn3->Enabled=true;
}
//---------------------------------------------------------------------------
//在私聊空间发送信息给选定用户
void __fastcall TForm1::BitBtn3Click(TObject *Sender)
{
if(Memo4->Lines->Text=="")
Application->MessageBox("错误, 不能发空信息!","提示",MB_OK);
else
{
AnsiString Data;
Data=yourName+"对"+StaticText1->Caption+"说:"+Memo4->Lines->Text;
ClientSocket2->Socket->SendText(Data);
// Memo3->Lines->Add(Data);
Memo4->Lines->Clear();
Memo4->SetFocus();
}
}
//---------------------------------------------------------------------------
//选择要传送的文件
void __fastcall TForm1::BitBtn5Click(TObject *Sender)
{
if(NMStrm1->Connected)
NMStrm1->Disconnect();
if(OpenDialog1->Execute())
{
Edit1->Text=OpenDialog1->FileName;
BitBtn6->Enabled=true;
}
}
//---------------------------------------------------------------------------
//登陆到服务器
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(ClientSocket1->Active)
{
ClientSocket1->Active=false;
ClientSocket1->Close();
}
ListBox1->Items->Clear();
ListBox2->Items->Clear();
Memo1->Clear();
Memo3->Clear();
if(InputQuery("登陆到服务器","请输入你的昵称:",yourName)) //输入昵称
{
StatusBar1->SimpleText="正在连接服务器...";
ClientSocket1->Address=MaskEdit1->Text;
ClientSocket1->Host=Edit2->Text;
ClientSocket1->Port=4000;
ClientSocket1->Active=true;
BitBtn1->Enabled=true;
BitBtn3->Enabled=true;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ListBox1->Items->Clear();
ListBox2->Items->Clear();
ListBox3->Items->Clear();
ClientSocket1->Active=false;
StatusBar1->SimpleText="连接中断...";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
WSACleanup();
ServerSocket1->Close();
ClientSocket1->Close();
ClientSocket2->Close();
NMStrm1->Cancel();
NMStrmServ1->Cancel();
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N2Click(TObject *Sender)
{
TabbedNotebook1->PageIndex=3;
StatusBar1->SimpleText="传送文件...";
Edit1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N1Click(TObject *Sender)
{
TabbedNotebook1->PageIndex=2;
StatusBar1->SimpleText="私聊空间...";
Memo4->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TabbedNotebook1Change(TObject *Sender, int NewTab,
bool &AllowChange)
{
if(NewTab==0) StatusBar1->SimpleText="连接设置...";
else if(NewTab==1) StatusBar1->SimpleText="网络会议...";
else if(NewTab==2) StatusBar1->SimpleText="私聊空间...";
else if(NewTab==3) StatusBar1->SimpleText="传送文件...";
else if(NewTab==4) StatusBar1->SimpleText="本机信息...";
else if(NewTab==5) StatusBar1->SimpleText="版本信息...";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
ListBox1->Items->Clear();
ListBox2->Items->Clear();
ListBox3->Items->Clear();
ClientSocket1->Active=false;
StatusBar1->SimpleText="连接已中断...";
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString Data=Socket->ReceiveText(); //接收私聊对象发送的信息
Memo3->Lines->Add(Data);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
ClientSocket1->Socket->SendText(yourName+"@logout@");
ClientSocket1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Error(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
Application->MessageBox("无法连接主机!网络不通或者服务端未启动!","连接失败!",MB_OK);
StatusBar1->SimpleText="连接服务器失败...";
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket2Connect(TObject *Sender,
TCustomWinSocket *Socket)
{
StatusBar1->SimpleText="成功连接到"+StaticText1->Caption;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket2Disconnect(TObject *Sender,
TCustomWinSocket *Socket)
{
ClientSocket2->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket2Error(TObject *Sender,
TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
Application->MessageBox("无法连接到对对象!网络不通或对方未在线!","连接失败!",MB_OK);
StatusBar1->SimpleText="连接对象失败...";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn6Click(TObject *Sender)
{
if(Edit1->Text=="")
{
Application->MessageBox("请选择需要传送的文件!","...",MB_OK);
BitBtn6->Enabled=false;
}
else
{
BitBtn6->Enabled=true;
TFileStream *MyFStream;
MyFStream = new TFileStream(OpenDialog1->FileName, fmOpenRead);
try
{
NMStrm1->Host = HostName;
NMStrm1->FromName = Edit1->Text;
NMStrm1->PostIt(MyFStream);
}
catch(...)
{
}
MyFStream->Free();
}
}
//---------------------------------------------------------------------------
//接收并保存发送过来的文件
void __fastcall TForm1::NMStrmServ1MSG(TComponent *Sender,
const AnsiString sFrom, TStream *strm)
{
AnsiString nmFilenameExt="";
int count=1;
for(count=1;count<=sFrom.Length();)
{
if(sFrom.SubString(count,1)==".")
break;
else
count++;
}
nmFilenameExt=sFrom.SubString(count+1,sFrom.Length()-count);
SaveDialog1->Title="保存文件到:";
//设置对话框的标题
SaveDialog1->InitialDir="\\Data";
//设置对话框的缺省路径
SaveDialog1->Filter="Files(*."+nmFilenameExt+")|*."+nmFilenameExt;
//设置文件过滤器
SaveDialog1->DefaultExt=nmFilenameExt;
//设置缺省文件名
if(SaveDialog1->Execute())
{
// StatusBar1->SimpleText="正在接收文件:"+sFrom+"...";
TFileStream *MyFStream;
MyFStream = new TFileStream(SaveDialog1->FileName, fmCreate);
try
{
MyFStream->CopyFrom(strm, strm->Size);
}
catch(...)
{
}
MyFStream->Free();
}
if(NMStrmServ1->BytesRecvd!=NMStrmServ1->BytesTotal)
ProgressBar1->Position=(float(NMStrmServ1->BytesRecvd)/float(NMStrmServ1->BytesTotal))*100;
else
{
ProgressBar1->Position=100;
// Application->MessageBox("接收文件结束!","提示",MB_OK);
ProgressBar1->Position=0;
StatusBar1->SimpleText="接收文件结束!";
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn7Click(TObject *Sender)
{
NMStrm1->Cancel();
NMStrmServ1->Cancel();
StatusBar1->SimpleText="传送文件...";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NMStrm1InvalidHost(bool &Handled)
{
Application->MessageBox("无法识别的主机!","",MB_OK);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NMStrm1ConnectionFailed(TObject *Sender)
{
Application->MessageBox("连接失败,请确认对方地址是否正确!","",MB_OK);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NMStrm1MessageSent(TObject *Sender)
{
if(NMStrm1->BytesSent!=NMStrm1->BytesTotal)
StatusBar1->SimpleText="正在传送文件:"+Edit1->Text+"...";
else
StatusBar1->SimpleText="传送文件结束!";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NMStrm1Status(TComponent *Sender,
AnsiString Status)
{
StatusBar1->SimpleText="Last WinSock error: "+IntToStr(NMStrm1->LastErrorNo);
if (NMStrm1->BeenCanceled)
StatusBar1->SimpleText="操作被取消...";
if (NMStrm1->BeenTimedOut)
StatusBar1->SimpleText="操作超时...";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NMStrm1Connect(TObject *Sender)
{
StatusBar1->SimpleText="连接成功...";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NMStrm1Disconnect(TObject *Sender)
{
// StatusBar1->SimpleText="中断连接...";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NMStrm1HostResolved(TComponent *Sender)
{
StatusBar1->SimpleText = "Host Resolved";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NMStrmServ1ClientContact(TObject *Sender)
{
StatusBar1->SimpleText = "Client Contacted";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NMStrmServ1Status(TComponent *Sender,
AnsiString Status)
{
if (StatusBar1 != 0)
StatusBar1->SimpleText = Status;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::NMStrm1PacketSent(TObject *Sender)
{
if(NMStrm1->BytesSent!=NMStrm1->BytesTotal)
ProgressBar1->Position=(float(NMStrm1->BytesSent)/float(NMStrm1->BytesTotal))*100;
else
{
ProgressBar1->Position=100;
// Application->MessageBox("传送文件结束!","提示",MB_OK);
ProgressBar1->Position=0;
StatusBar1->SimpleText="传送文件结束!";
}
}
//---------------------------------------------------------------------------
本文地址:http://com.8s8s.com/it/it24227.htm