最初实现是由于课题要求运用WinSock来实现SOCKET通信,就去了解了一下了一下winsock的官方文档:微软Winsock文档

WINSock2最初设计目的便是向Windows添加IPv4通信的支持,其工作原理就是在原有的Socket编程上进一步适应于Windows的开发与使用,其具体实现步骤如下:

但在这里要实现一个多人的聊天室,故就要引入多线程的开发,在服务端Server要为每一位进入的Client开辟一个独立线程,而客户端Client要求收发也要独立进行,于是就为send和recv过程均开辟一个线程,于是就对上述流程图进行了一下改进:

这里的服务端要实现广播的功能就要在主线程内保存每一位在线客户端的套接字描述符和addr信息,于是就想引入map来建立映射:

     /**将接入客户端的sock描述符与addr建立匹配存入client_map*/map<SOCKET, struct sockaddr_in> client_map;Mutex.lock();client_map[client] = addrClient;count_online++;cout << "新用户进入:" << temp << ":" << addrClient.sin_port << "  此时在线人数:" << count_online << endl;Mutex.unlock();

此处的sockaddr_in结构体是引进winsock2.h库里的定义,具体属性可以查询文档,这里有引入互斥锁,就是由于每个线程都对Client_map共享资源涉及读写操作,造成了读写者冲突的问题,当时也没咋考虑,结果在子线程迭代器遍历纠错了半天~,很重要呀!!广播的大概实现思路如下图:

在子线程中的实现广播操作就比较简单了:

//将聊天信息广播给每一个客户端iter = client_map.begin();Mutex.lock();while (temp_iter != 0){char msg[BUFFER_SIZE];memset(msg, 0, sizeof(msg));cout << "发送的port:" << iter->second.sin_port << endl;sprintf_s(msg, "%s,[%s:%d] :%s\n", szDateTime, temp,temp_addr.sin_port, buf);re_s = send(iter->first, msg, strlen(msg), 0);}iter++;}Mutex.unlock();

服务端的大概思路就是这样,至于Bind(),listen(),accpet()过程就不细说了,注意这里由于这里是多客户端的通信,故Accept()过程就要在循环内不断轮序处理等待建立链接对列。

在开发客户端时,由于要涉及到UI开发,就打算用c++的QT来实现,没想到在QT上做多线程可真麻烦呀!!(主要是我太菜了),由于子线程不能对UI进行操作,在recv线程中,当收到消息时,利用信号槽方式通知UI线程刷新TextBrowser,整了我好长时间,,,

recv线程函数(有些累赘的代码我就给删了)

//recv线程函数
int MainWindow::recv_thread()
{int re = 0;while (1){memset(buf, 0, sizeof(buf));re = recv(client, buf, sizeof(buf), 0);data = "";if (re == SOCKET_ERROR){recv_data = "fail to recv";}else{recv_data = QString::fromUtf8(buf);}data = recv_data;emit emitsendRecvdata();}}

开辟新线程并建立信号槽链接

 QObject::connect(this,SIGNAL(emitsendRecvdata()),this,SLOT(refrach_text()));std::thread t1(MainWindow::recv_thread,this);t1.detach();

槽函数来刷=刷新页面

void MainWindow::refrach_text()
{ui->textBrowser->append(data);
}

至此主题思路就是这样,但还有很多BUG,比如服务端如何确定长连接的客户端是否在线,参照了一下其他博客发现可以靠心跳检测来实现,但我懒得弄了:)

还有一个问题就是字符乱码的问题,初始设计只能发生英文字符,中文字符会发生乱码,找了下原因发现是由于QString 与 char * 造成的,解决方法是:在QString转char是先转成std::string过渡量;char转QString可是用QString再带的fromutf_8函数,亲测有效。

参考博客:

http://www.cnblogs.com/snaildev/p/7724867.html 心跳包实现思路

基于winsock的局域网聊天室实现相关推荐

  1. java毕业设计——基于java+TCP+UDP的局域网聊天室系统设计与实现(毕业论文+程序源码)——局域网聊天室系统

    基于java+TCP+UDP的局域网聊天室系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+TCP+UDP的局域网聊天室系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地 ...

  2. 局域网服务器发送消息,Java实现简单局域网聊天室

    本文实例为大家分享了Java实现简单局域网聊天室的具体代码,供大家参考,具体内容如下 Java 的Socket编程: 1.TCP协议是面向连接的.可靠的.有序的.以字节流的方式发送数据,通过三次握手方 ...

  3. 基于jquery的ajax聊天室系统,基于jQuery的Ajax聊天室应用毕业设计(含外文翻译)...

    基于jQuery的Ajax聊天室应用毕业设计(含外文翻译) 毕业设计(论文) I 基于基于 jQuery 的的 Ajax 聊天室应用聊天室应用 摘摘 要要 随着网络的逐渐普及,以及网络技术的不断发展, ...

  4. java网络编程,通过TCP,Socket实现多对一的局域网聊天室

    java网络编程,通过TCP,Socket实现多对一的局域网聊天室 可以实现多个客户端连接服务器,服务器接收到信息就会把信息广播到所有的客户端 这是服务器端的代码 View Code import j ...

  5. workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的)...

    workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的) 一.总结 1.下面链接里面还有一个来聊的php聊天室源码可以学习 2. ...

  6. Android基于UDP的局域网聊天通信

    代码地址如下: http://www.demodashi.com/demo/12057.html 记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果 1. 开发环境 1.1 开发工 ...

  7. 基于flask的网页聊天室(四)

    基于flask的网页聊天室(四) 前言 接前天的内容,今天完成了消息的处理 具体内容 上次使用了flask_login做用户登录,但是直接访问login_requare装饰的函数会报401错误,这里可 ...

  8. php聊天室的设计实现,基于PHP的Ajax聊天室系统的设计与实现

    第7卷 第20期 2007年10月167121819(2007)2025396204 科 学 技 术 与 工 程 Science Technol ogy and Engineering Vol .7 ...

  9. 基于Java+Swing实现聊天室

    基于Java+Swing实现聊天室 一.系统介绍 二.功能展示 三.其它 1.其他系统实现 四.获取源码 一.系统介绍 Java聊天室系统主要用于实现在线聊天,基本功能包括:服务端和客户端.本系统结构 ...

  10. 【基于UDP的网络聊天室】

    总结下近期写的小项目,在学习中同时积累解决问题的经验,以及真正的项目中解决问题的思路,如有不合理地方,请多指教! 一.项目名称 基于UDP的网络聊天室 二.功能 1.当有新用户登录时,其他在线用户可以 ...

最新文章

  1. Java子线程中的异常处理(通用)
  2. Example of ApplicationContextAware in Spring--转
  3. 从消息到数据湖:看 Apache RocketMQ、Hudi、Kyuubi 最新进展
  4. Codeforces - 961E Tufurama
  5. 直流UPS的研究和应用前景
  6. MySQL 集群方案介绍
  7. linux 故障注入_用软件中断实现的Linux内核故障注入方法
  8. Python与自然语言处理搭建环境
  9. 软件开发工程师应该具备哪些证书_智能展厅设计应该具备哪些特点?
  10. 新闻媒体是怎样使用计算机的,计算机技术在新闻上的应用
  11. 拓端tecdat|R语言中基于混合数据抽样(MIDAS)回归的HAR-RV模型预测GDP增长
  12. 深圳465亿建11代生产线,TCL三星带头认购股权
  13. 8-3-无用单元收集-动态存储管理-第8章-《数据结构》课本源码-严蔚敏吴伟民版...
  14. python中的颜色及其编码
  15. 网站备案靠谱吗_网上出现的代理备案可信?为什么可以4-7天备案成功?
  16. 图像去雾去雨去模糊去噪
  17. FTP客户端(利用sun.net.ftp.FtpClient实现)
  18. 使用vue-cli2.x入门简单demo游戏
  19. ⌨RK61键盘使用方法
  20. VCS2018 linux 安装

热门文章

  1. 禅道项目管理软件测试功能模块,禅道使用分享:禅道用例管理流程
  2. 几行代码,把你的小电影全部藏好了!
  3. 中学关于计算机方面的课题研究,《多媒体信息技术与初中生物教学的整合》课题研究方案...
  4. OpenCASCADE7.6编译
  5. S32K144_FTM定时器中断
  6. 计算机病毒分为哪三类
  7. 保姆级 nas 服务器搭建手册
  8. CSDN 创始人蒋涛:开源吞噬世界,得开发者得天下
  9. Php开发Dlp加密,DLP与文档透明加密 后防泄露时代之争
  10. 未来互联网+大数据时代,DT革命互联网大数据应用简析