第一个项目:基于TCP的聊天项目
-
主要功能实现:
Register Login TalkToOne TalkToGroup GetList Exit。
-
使用工具:
Json打包数据 Libevent实现I/O复用 mysql数据库存储用户相关信息及离线消息。
-
项目框架:
Cli:
提供用户选择服务:Register、Login、Geilist、Talk to one、Talk to group、exit。
用户需选择服务,输入相关信息
根据不同服务调用相应功能函数
利用json打包数据发送给服务器
接收到服务器的回应后,若登陆成功,需要启动线程接收消息并打印
用户再次选择之后的服务。
Ser:
利用半同步半反应堆完成线程间任务分工
主线程接收连接,将套接字分给当前较为空闲的子线程监听
通过socket_pair实现父子线程间信息交互
子线程通过libevent实现I/O复用,当有事件来的时候通过MVC处理
根据请求类型的不同,使用相应的视图来处理。
感谢老师梳理的框架030
-
项目实现:
Cli部分代码:
//fun.cpp
string myname;
void *pth_run(void *arg)
{
int c = (int) arg;
char buff[1024] = {0};
int n = recv(c,buff,1023,0);
while(n != 0)
{
cout<<"\033[36m"<
memset(buff,0,1024);
n = recv(c,buff,1023,0);
}
}
void do_register(int fd)
{
string name;
string pw;
//让用户输入name pw
cout<<"--> your name: "<
cin>>name;
cout<<"--> your password: "<
cin>>pw;
//JSON 打包数据
Json::Value val;
val["reason_type"] = MSG_TYPE_REGISTER;
val["name"] = name;
val["pw"] = pw;
//发送到服务器
if(-1 == send(fd,val.toStyledString().c_str(),strlen(val.toStyledString().c_str()),0))
{
cerr<<"//send reason fail;errno:"<
return;
}
//接受服务器消息(判断success/error)
char buff[256] = {0};
if(0 < recv(fd,buff,255,0))
{
if(strncmp(buff,"register sucess!",16) == 0)
{
cout<<"-----register sucess!-----"<
return;
}
}
cerr<<"//register fail;"<
}
void do_login(int fd)
{
bool success = false;
string name;
string pw;
//让用户输入name pw
cout<<"--> your name: "<
cin>>name;
cout<<"--> your password: "<
cin>>pw;
//Json打包数据
Json::Value val;
val["reason_type"] = MSG_TYPE_LOGIN;
val["name"] = name;
val["pw"] = pw;
//发送
if(-1 == send(fd,val.toStyledString().c_str(),strlen(val.toStyledString().c_str()),0))
{
cerr<<"send reason fail;errno:"<
return;
}
//接受服务器回应(判断success/error)
char buff[256] = {0};
if(0 < recv(fd,buff,255,0))
{
if(strncmp(buff,"login sucess!",13) == 0)
{
cout<<"----- \033[35m"<
success = true;
}
else cout<<"//login fail!"<
}
if(success)
{
//启动一个线程(专门接受数据和打印数据)
myname = name;
while(1)
{
cout<<"\033[31m1. get list 2. talk to one 3.talk to group 4.exit\n\033[0m"<
cout<<"--------------------------------------------------"<
pthread_t id;
pthread_create(&id,NULL,pth_run,(void *)fd);
int c;
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
