好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C++怎么实现Window环境聊天室功能

本篇 内容 介绍了“C++怎么实现Window环境聊天室 功能 ”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1.服务端

根据上述所说, 一个 服务器 需 要做 的事:

① 接受新的客户端连接请求

② 聆听各个已连接的客户端的新消息

③ 将收到的信息逐个传送给各个已连接的服务器

所以,我设置服务器拥有两个线程, 一个 线程负责① 功能 , 一个 线程负责②③ 功能 (注:这里我使用的是接受到消息就马上转发,但并没有容器进行保存,若高并发阶段可能会发生漏发)。

① 创建聆听客户端连接请求线程

void?CreateListenThread(int?sock_serve,list<int>*users){
????sockaddr_in?user_addr;
????int?user_size?=?sizeof(user_addr);
?
????//?循环接受
????while(1){
????????//?每次循环暂停100ms,不热会占用大量 cpu 
????????this_thread::sleep_for(chrono::milliseconds(100));
????????int?user_sock?=?accept(sock_serve,(sockaddr*)(&user_addr),&user_size);
????????if(user_sock==-1){
????????????//表明无连接
????????????continue;
????????}
????????if(user_sock!=INVALID_SOCKET){
????????????lock_guard<mutex>mtx_locker(mtx);
????????????(*users).push_back(user_sock);
????????????cout<<"成功加入了新client:"<<user_sock<<endl;
????????}
????}
????return;
}

?②? 创建聆听客户端发送消息的线程

//广播消息
void? bro adcast(list<int>*users,?char?*str){
????for(auto?iter=users->begin();iter!=users->end();iter++){
????????int?flag?=?send(*iter,?str,?strlen(str)+1,?0);
????????if(!flag){
????????????cout<<*iter<<" 用户 发送失败"<<endl;
????????}
????}
????return;
}
void?CreateRecvThread(int?sock_serve,list<int>*users){
????char?revc_string[maxLen];
????int?recvbuffs;
????while(1){
????????this_thread::sleep_for(chrono::milliseconds(300));
????????lock_guard<mutex>mtx_locker(mtx);
????????for(auto?iter=users->begin();iter!=users->end();){
????????????recvbuffs?=?recv(*iter,?revc_string,maxLen,0);
//????????????cout<<"iter="<<*iter<<"?len="<<recvbuffs<<endl;
????????????if(recvbuffs==0){
????????????????cout<<"客户端:"<<*iter<<"已 退出 !!"<<endl;
????????????????users->erase(iter++);
????????????????continue;
????????????}
????????????else?if(recvbuffs<0){
????????????????iter++;
????????????}
????????????else{
????????????????cout<<string(revc_string,recvbuffs)<<endl;
???????????????? bro adcast(users,?revc_string);??//?进行广播
????????????????memset(revc_string,0,sizeof(revc_string));
????????????????iter++;
????????????}
????????}
????}
????return;
}

在这里 ,我设置的是 当服务器接受到某个客户端发送的消息后,立马传送。如果需要 解决 高并发出现的问题,我 在这里 设想 一个 提议,设置 queue队列 ,当服务器接受消息后立马将消息写入队列中,另外再创建 一个 线程主要负责将队列中的消息广播出去(当然了,队列必须需要互斥操作),从而使得服务器发送消息和接受消息解耦。

2.客户端

根据上述所说,客户端 在这里 需 要做 的事:

① “打电话”,也就是和指定服务器连接上

② 发送消息

③ 接收其他所有客户端的消息

所以,这部分我创建了两个线程, 一个 线程主要负责发送消息,一线程主要负责接受消息。

①? 创建发送消息的线程

//?发送数据
void?CreateSendThread(int?socket_client,?const?char?*name){
????char?send_string[maxLen],tmp[maxLen];
????while(1){
????????this_thread::sleep_for(chrono::milliseconds(300));
?
????????lock_guard<mutex>mtx_locker(mtx);
????????memset(send_string,0,sizeof(send_string));
????????scanf(" %s ",tmp);
?
????????strcat(send_string,name);
????????strcat(send_string,"说:");
????????strcat(send_string,tmp);
????????send(socket_client,?send_string,strlen(send_string)+1,0);
????}
????return;
}

通过send() 函数 将数据信息传送到指定服务器

② 创建聆听服务器广播消息的线程

//?接受数据
void?CreateRecvThread(int?sock_client){
????char?buff[maxLen];
????while(1){
????????this_thread::sleep_for(chrono::milliseconds(300));
?
????????lock_guard<mutex>mtx_locker(mtx);
????????int?revc_len=recv(sock_client,buff,sizeof(buff),0);
????????if(revc_len==0){
????????????cout<<"服务器已 关闭 ,服务结束!"<<endl;
????????????break;
????????}
????????else?if(revc_len<0)continue;
????????else{
????????????printf(" %s 
",buff);
????????????memset(buff,0,sizeof(buff));
????????}
????}
}

通过revc() 函数 接受服务器广播消息,当

返回值 == 0时,服务器已断连,需要结束线程
返回值 <0? 时,服务器没有传送消息过来
返回值 >0 时,服务器传送数据过来(注意:当传送空串过来时,返回值也为1)

3. 实验结果

上图中,左一为服务器,左二、左三为客户端,可以见到,当客户端发送消息时,其他客户端都接受到消息。

“C++怎么实现Window环境聊天室 功能 ”的 内容 就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家 输出 更多高质量的实用 文章 !

小编说

以上是 为你收集整理的 C++怎么实现Window环境聊天室功能 全部内容。

如果觉得 网站内容还不错,欢迎将 推荐给好友。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

Win11右键设计反人类?教你恢复Win11完整右键菜单方法

微软已经在10月5日发布了Windows 11正式版,很多朋友也已经升级了。不过对于Win11的一些新设计,并不是所有人都能适应的,例如新的右键快捷菜单,就不少朋友表示接受不了。

win11右键怎么设置原来的模样 win11右键菜单改回传统模式操作方法

今天小编就来为大家具体讲一讲win11右键菜单改回传统模式教程,需要的朋友一起看看。

win10右键新建卡顿2023解决方法

在使用我们的鼠标在桌面新建文件夹的时候,总是会出现一些卡顿延迟的情况,对于急性子来说,简直非常不友好没那么这个问题该怎么去解决呢,其实重装鼠标驱动或者使用命令代码都能解决。

win7升级win10会变流畅吗

在软件宣布对win7系统停止支持,将不会对win7系统有任何的更新和修复,大家在继续使用win7系统会有很大的风险,如果电脑支持我们升级win10系统运行起来也不会有卡顿的哦!

win7升级win10错误代码0x80072f8f-0x20000解决方法

win7系统目前微软已经不支持更新和修复出现的问题了,大家都在把win7升级为win10系统。其中出现错误代码0x80072f8f-0x20000该如何解决?这里帮助大家详细讲解一下解决方法,希望对大家有帮助!

win10右键显示设置打不开怎么办

有很的用户们在重装系统之后,或者不小心对系统文件进行了清理,导致在使用win10系统的时候,鼠标右键无法打开显示设置了,这时候只要先执行命令,再去服务中打开相关内容即可。

win7升级win10需要多少内存

win7在微软停止服务之后大家为了电脑更加安全,很多用户都选择升级为win10系统。在升级之前大家想了解一下win10系统需要多少内存才支持,这里详细讲解win10需要的电脑配置。

win11跳过联网激活方法

很多预装了win11的电脑在首次开机的时候会需要联网激活,但是激活后我们就无法验机确认了,这时候可以通过按下快捷键,再使用命令代码的方法来跳过联网激活。

win11跳过登录微软账户

由于win11开启需要用微软账户登录,而使用微软账户登录需要联网,但是不少朋友新机开机时又跳过了联网,这时候会出现无法进入系统的情况,其实我们只要随便输入一个不存在的账户就可以了。

Win10鼠标指针抖动怎么办?Win10鼠标指针抖动的解决方法

最近有不少小伙伴在使用Win10电脑的时候发现自己的鼠标指针会自动抖动,经常会在使用的时候跑偏掉,那么遇到这种情况要怎么办呢?下面就和小编一起来看看有什么解决方法吧。Win10鼠标指针抖动的解决方法1、首先检查一下是不是鼠标本身的原因,将鼠标插到别的电脑上试一下会不会出现鼠标光标乱跑的问题。依然出现...

查看更多关于C++怎么实现Window环境聊天室功能的详细内容...

  阅读:30次