|
|
用C++Builder打造网上聊天软件-MyNetMeeting(2) |
出处:PConline 责任编辑:pjl |
[04-2-14 9:29]
| 作者:陈明浩
| 1.服务器端
ServerSocket:用于与多个客户端连接,当有 用户登陆时就把他的昵称和他的主机地址用两 个列 表对应地登记下来,并把当前的所有用户的信息( 包括昵称和主机地址)发送给刚刚登陆的该用户, 那么刚登陆的用户就有了所有在线用户的信息。同 时,服务器会把新登陆的用户的信息发送给所有已在线的用户,那么已在线用户就都得到新登陆用户的信息。当NetMeeting的时候,用户的信息首先发送到服务器端上,服务器端根据在线用户列表的记录再把该信息转发到所有在线用户,这样所有用户都会收到信息,从而实现了多人的NetMeeting。
主要代码:
void __fastcall TForm1::Button1Click(TObject *Sender) //关闭服务器
{
AnsiString SysInfo;
SysInfo="["+TimeToStr(Now())+"]"+" 与服务器失去连接!请重新连接!";
for(int i=0;i
{ServerSocket1->Socket->Connections[i]->SendText(SysInfo);}
ServerSocket1->Close();
Form1->Close();
}
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
AnsiString Data=Socket->ReceiveText(); //接收用户发送的信息
AnsiString SubData1=Data.SubString(Data.Length()-7,Data.Length()); //分析信息
if(SubData1=="@login@@") //如果是用户登陆的信息
{
int AddLen=StrToInt(Data.SubString(1,2));
AnsiString Address=Data.SubString(3,AddLen);
AnsiString SubData2=Data.SubString(3+AddLen,Data.Length()-8-2-AddLen);
ListBox1->Items->Add(SubData2); //用户信息加入到用户列表
ListBox2->Items->Add(Address);
AnsiString SysInfo="["+TimeToStr(Now())+"]"+SubData2+" 加入了会议!";//显示系统信息
Memo1->Lines->Add(SysInfo);
}
else if(SubData1=="@logout@") //如果是用户退出会议
{
int AddLen=StrToInt(Data.SubString(1,2));
AnsiString Address=Data.SubString(3,AddLen);
AnsiString SubData2=Data.SubString(3+AddLen,Data.Length()-8-2-AddLen);
int Index1;
Index1=ListBox1->Items->IndexOf(SubData2); //从用户列表中删除该用户信息
ListBox1->Items->Delete(Index1);
int Index2;
Index2=ListBox2->Items->IndexOf(Address);
ListBox2->Items->Delete(Index2);
Memo1->Lines->Add("["+TimeToStr(Now())+"]"+SubData2+" 退出了会议!"); //显示系统信息
}
else
{
Data="["+TimeToStr(Now())+"]"+Data; //加入系统时间
Memo1->Lines->Add(Data);
}
if(m!=0)
{
for(int i=0;i
{ServerSocket1->Socket->Connections[i]->SendText(Data);} //向所有用户转发信息
}}
void __fastcall TForm1::ServerSocket1Accept(TObject *Sender, //与客户端建立连接
TCustomWinSocket *Socket)
{
for(int i=0;i
{AnsiString SysInfo1=IntToStr(ListBox2->Items->Strings[i].Length())+ListBox2->
Items->Strings[i]+ListBox1->Items->Strings[i]+"@login@@"; //把所有在线用户信息发给用户
ServerSocket1->Socket->Connections[m]->SendText(SysInfo1);
}
m=m+1;
}
void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,//有用户退出会议
TCustomWinSocket *Socket)
{
m=m-1;
}
相关文章:
| | | -
| |