之前的代码框架:part1
1 私聊功能的实现
1.1 客户端相关代码;
- 为客户端添加私聊功能,用户可以选择一名目标用户名,然后开始和目标进行私聊,指定目标后先发送目标名到服务器进行绑定,而后每条消息都发送到服务器,服务器再转发到目标用户。
- 客户端有两个线程,一个线程用于发送信息给对方,另外一个线程接收信息。
- 为服务器添加处理私聊业务的代码,服务器接收客户端发来的绑定信息和私聊,绑定目标用户并将每条私聊信息都转发到目标用户的客户端处。
- 当用户输入 exit 时,能够离开私聊,返回到主界面。 要面向对象编程,进行类封装。
修改后的 HandleClient 函数:
void client::HandleClient(int conn){
int choice;
string name,pass,pass1;
bool if_login=false;//记录是否登录成功
string login_name;//记录成功登录的用户名
cout<<" ------------------\n";
cout<<"| |\n";
cout<<"| 请输入你要的选项:|\n";
cout<<"| 0:退出 |\n";
cout<<"| 1:登录 |\n";
cout<<"| 2:注册 |\n";
cout<<"| |\n";
cout<<" ------------------ \n\n";
//开始处理注册、登录事件
while(1){
if(if_login)
break;
cin>>choice;
if(choice==0)
break;
//注册
else if(choice==2){
cout<<"注册的用户名:";
cin>>name;
while(1){
cout<<"密码:";
cin>>pass;
cout<<"确认密码:";
cin>>pass1;
if(pass==pass1)
break;
else
cout<<"两次密码不一致!\n\n";
}
name="name:"+name;
pass="pass:"+pass;
string str=name+pass;
send(conn,str.c_str(),str.length(),0);
cout<<"注册成功!\n";
cout<<"\n继续输入你要的选项:";
}
//登录
else if(choice==1&&!if_login){
while(1){
cout<<"用户名:";
cin>>name;
cout<<"密码:";
cin>>pass;
string str="login"+name;
str+="pass:";
str+=pass;
send(sock,str.c_str(),str.length(),0);//发送登录信息
char buffer[1000];
memset(buffer,0,sizeof(buffer));
recv(sock,buffer,sizeof(buffer),0);//接收响应
string recv_str(buffer);
if(recv_str.substr(0,2)=="ok"){
if_login=true;
login_name=name;
cout<<"登录成功\n\n";
break;
}
else
cout<<"密码或用户名错误!\n\n";
}
}
}
//登录成功
while(if_login&&1){
if(if_login){
system("clear");
cout<<" 欢迎回来,"<<login_name<<endl;
cout<<" -------------------------------------------\n";
cout<<"| |\n";
cout<<"| 请选择你要的选项: |\n";
cout<<"| 0:退出 |\n";
cout<<"| 1:发起单独聊天 |\n";
cout<<"| 2:发起群聊 |\n";
cout<<"| |\n";
cout<<" ------------------------------------------- \n\n";
}
cin>>choice;
if(choice==0)
break;
//私聊
if(choice==1){
cout<<"请输入对方的用户名:";
string target_name,content;
cin>>target_name;
string sendstr("target:"+target_name+"from:"+login_name);//标识目标用户+源用户
send(sock,sendstr.c_str(),sendstr.length(),0);//先向服务器发送目标用户、源用户
cout<<"请输入你想说的话(输入exit退出):\n";
thread t1(client::SendMsg,conn); //创建发送线程
thread t2(client::RecvMsg,conn);//创建接收线程
t1.join();
t2.join();//t1 t2线程结束才能结束该线程;
}
}
close(sock);
}
修改后的 SendMsg 函数:
发送形式为:content:xxxxxxx
//注意,前面不用加static!
void client::SendMsg(int conn){
while (1)
{
string str;
cin>>str;
//发送消息
str="content:"+str;
int ret=send(conn, str.c_str(), str.length(),0)