分享
 
 
 

我写的一个简单的聊天程序(bcb)

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

服务器端: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="传送文件结束!";

}

}

//---------------------------------------------------------------------------

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有