Qt实现Winsock网络编程—TCP服务端和客户端通信(多线程)

前言

感觉Winsock网络编程的api其实和Linux下网络编程的api非常像,其实和其他编程语言的网络编程都差不太多。博主用Qt实现的,当然不想用黑窗口呗,有界面可以看到,由于GUI编程的话 一般UI进程不能阻塞,肯定需要多线来实现,在等待用户连接的时候accept,和客户端通信 等待消息的时候recv这些都是阻塞的 都需要在后台进程中。博主使用的是Qt5.9.7

界面效果

先看下效果再说

Winsock面向连接的接口

Winsock初始化和释放

WSAStartup、WSACleanup

服务端:

socket() -> bind() -> listen() -> accept() -> send() / recv() -> closesocket()

客户端:

socket() -> connect() -> send() / recv() -> closesocket()

这些函数都在msdn上有,这里就不过多的阐述

代码展示

服务端 将与客户度建立连接的 过程放到单独的线程中进行处理了,这个线程 做的事就是等待客户端连接,客户端连接后 单独再开一个线程专门与客户度进行通信,这样就不会导致界面无响应了。这里线程和线程间的通信是使用的Qt中的信号槽机制。

处理客户端连接请求代码

void SocketThread::run()
{sockaddr_in clientAddr;int size = sizeof(clientAddr);while(!isInterruptionRequested()){//每次接受新客户端将之前的地址信息清0memset(&clientAddr,0,sizeof(clientAddr));//等待新客户端连接 阻塞函数,结束线程 使用requestInterruption打断线程并没有用,只能使用terminate 终止线程SOCKET client = ::accept(mListen,(sockaddr*)&clientAddr,&size);char* clientIp = inet_ntoa(clientAddr.sin_addr);int clientPort = ntohs(clientAddr.sin_port);QTime time = QTime::currentTime();QString str = time.toString("hh:mm:ss");QString msg = QString("%1 [%2:%3] connect success").arg(str).arg(clientIp).arg(clientPort);//新客户端连接,通知 UI 更新界面emit isMsg(msg);//开启新线程和客户端进行通信MsgThread* msgThread = new MsgThread(client,clientAddr,parent);msgThread->start();connect(msgThread,&MsgThread::isMsg,this,[=](QString msg){//转发消息给 UI进程,UI进行界面更新emit isMsg(msg);});connect(this,&SocketThread::isClose,this,[=](){msgThread->terminate();msgThread->quit();delete msgThread;});}
}

服务端和客户端通信的代码

void MsgThread::run(){//inet_addr点分十进制转网络ip地址 ,inet_ntoa网络转点分十进制char* clientIp = inet_ntoa(mAddr.sin_addr);int clientPort = ntohs(mAddr.sin_port);while(true){memset(resp,0,1024);char buf[1024] = {0};//阻塞等待 接受信息int ret = recv(mClient,buf,1024,0);QTime time = QTime::currentTime();QString str = time.toString("hh:mm:ss");if(ret == 0){//连接断开emit isMsg(QString("%1 [%2:%3] is closed!!!").arg(str).arg(clientIp).arg(clientPort));break;}QString msg = QString("%1 [%2:%3]:%4").arg(str).arg(clientIp).arg(clientPort).arg(buf);//接受到消息,通知UI 界面更新emit isMsg(msg);//给用户进行响应消息,小写变大写strcpy(resp,QString(buf).toUpper().toUtf8().data());qDebug() << "给客户端发送消息:" << resp;send(mClient,resp,strlen(resp)+1,0);}
}

完整代码

完整项目代码可以点这里进行下载,或者github下载最新代码。

Qt:Qt实现Winsock网络编程—TCP服务端和客户端通信(多线程)相关推荐

  1. windows Socket编程之TCP服务端与客户端

    在前面的文章中有一篇讲到了命名管道通信,它是创建一根管道来进行进程之间或网络之间通信的.但是它有些缺陷,比如说效率较低等.而从这篇文章开始将介绍socket编程.socket是通过TCP,UDP,IP ...

  2. 2-3 建立简易TCP服务端、客户端【socket server/client】【socket、bind、listen、accept、send、closesocket】【conect、recv】

    2-3 建立简易TCP服务端.客户端 文章目录 2-3 建立简易TCP服务端.客户端 0-前言 1-服务端简易功能 2-客户端简易功能 3-代码逻辑 4-服务端 4-1 建立socket 4-2 绑定 ...

  3. C#Winform窗体实现服务端和客户端通信例子(TCP/IP)

    Winform窗体实现服务端和客户端通信的例子,是参考这个地址 http://www.cnblogs.com/longwu/archive/2011/08/25/2153636.html 进行了一些异 ...

  4. Go语言实现TCP服务端和客户端

    Go语言实现TCP服务端和客户端 Go语言实现TCP通信 TCP协议 TCP服务端 TCP客户端 本文转载自Go语言实现TCP通信 Go语言实现TCP通信 TCP协议 TCP/IP(Transmiss ...

  5. 多线程服务端和客户端通信

    ❤️强烈推荐人工智能学习网站❤️ 在不同的机器上可以用TCP进行通信,在同一台机器上也可以,用客户端/服务端模式通信耦合度更低,golang示例多线程服务端和客户端通信,用C++写也可以 packag ...

  6. [笨木头FireFly 03]完整的服务端和客户端通信

    #PS: 其实这篇文件是2013.10.12写完的,一直没发布,因为从那天起,我又跑回去折腾客户端的东西了(打算用Cocos2d-x3.0做下一个游戏),以及我的老游戏的维护和更新.总之各种借口(小若 ...

  7. OSI七层、TCP/IP五层、UDP、TCP的socket编程(服务端及客户端)、字节序转换、多进程以及多线程服务端的实现

    1.网络以覆盖范围划分:局域网/城域网/广域网   互联网/因特网   以太网/令牌环网--组网方式 2.在网络中必须能够为一表示每一台主机,才能实现点到点的精确通信            IP地址: ...

  8. WinSock网络编程基础(2)客户端

    接下来说一下如何用WinSock创建基于TCP/IP模型的客户端和服务器. TCP可以提供两个计算机间可靠无误的数据传输,应用程序使用TCP通信时,会在两台计算机之间建立一个虚拟连接,连接之后计算机之 ...

  9. MFC:Socket编程—TCP服务端和多个客户端通信

    前言 MFC是微软基础类库,于 C++ 对于 C语言来说,MFC对于window API ,MFC 就相当于C++,window API 相当于C.MFC 封装了 window API 使用起来更加的 ...

最新文章

  1. AWS pytorch-model API
  2. 【2017-11-26】Linq表连接查询
  3. Python使用aiohttp异步爬取糗事百科
  4. vc6.0mfc中单选按钮如何分组_按钮系列02-搞定按钮和选框的14个秘诀
  5. python删除对象引用_使用Python删除内存中的对象
  6. 计算机英语四六级考试时间,英语四六级口语考试时间
  7. 基于JAVA+Servlet+JSP+MYSQL的教室资源管理系统
  8. 堆结构导致数据文件不能收缩
  9. PPP 守护进程 RCE 漏洞已存在17年,可控制几乎所有的 Linux 系统
  10. UVA 1329 Corporative Network(并查集:路径压缩)
  11. log日志java web_Java Web log4j (日志)
  12. 2017软件构造3.3
  13. 使用PE安装纯净版win7
  14. 工作一年时期的土豆总结——复杂度和困难度
  15. python实现输出日历_python实现输出日历
  16. python笔记005-字符串-列表-元组
  17. 如何解密Token?
  18. 电阻 电容 电感 磁珠的选型总结对比
  19. 手机怎样测海拔高度?手机测量海拔的方法分享。
  20. 华为p40pro android11,华为P40Pro上手对比iPhone11Pro:差距拉开、黑马逆袭!

热门文章

  1. fcpx插件:21个模拟相机取景器数码屏显效果预设Camera Rec
  2. kayui进行添加_layui实现点击按钮添加一行的方法
  3. scsi协议_存储协议有哪些类型?常见存储协议分析
  4. postMessage跨域、跨iframe窗口消息传递
  5. java stringbuffer长度限制_Java中的String、StringBuffer和StringBuilder
  6. Web前端笔记-字符串自适应tip提示框(适应大小自动换行JS中静态工具类实现)思路
  7. Redis工作笔记-spring-data-redis的基本使用
  8. HTML期末作业-旅游网页作业Html+css+Bootstarp
  9. 计算机板报设计简单,计算机板报制作
  10. Django之Mode的外键自关联和引用未定义的Model