Qt:Qt实现Winsock网络编程—TCP服务端和客户端通信(多线程)
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服务端和客户端通信(多线程)相关推荐
- windows Socket编程之TCP服务端与客户端
在前面的文章中有一篇讲到了命名管道通信,它是创建一根管道来进行进程之间或网络之间通信的.但是它有些缺陷,比如说效率较低等.而从这篇文章开始将介绍socket编程.socket是通过TCP,UDP,IP ...
- 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 绑定 ...
- C#Winform窗体实现服务端和客户端通信例子(TCP/IP)
Winform窗体实现服务端和客户端通信的例子,是参考这个地址 http://www.cnblogs.com/longwu/archive/2011/08/25/2153636.html 进行了一些异 ...
- Go语言实现TCP服务端和客户端
Go语言实现TCP服务端和客户端 Go语言实现TCP通信 TCP协议 TCP服务端 TCP客户端 本文转载自Go语言实现TCP通信 Go语言实现TCP通信 TCP协议 TCP/IP(Transmiss ...
- 多线程服务端和客户端通信
❤️强烈推荐人工智能学习网站❤️ 在不同的机器上可以用TCP进行通信,在同一台机器上也可以,用客户端/服务端模式通信耦合度更低,golang示例多线程服务端和客户端通信,用C++写也可以 packag ...
- [笨木头FireFly 03]完整的服务端和客户端通信
#PS: 其实这篇文件是2013.10.12写完的,一直没发布,因为从那天起,我又跑回去折腾客户端的东西了(打算用Cocos2d-x3.0做下一个游戏),以及我的老游戏的维护和更新.总之各种借口(小若 ...
- OSI七层、TCP/IP五层、UDP、TCP的socket编程(服务端及客户端)、字节序转换、多进程以及多线程服务端的实现
1.网络以覆盖范围划分:局域网/城域网/广域网 互联网/因特网 以太网/令牌环网--组网方式 2.在网络中必须能够为一表示每一台主机,才能实现点到点的精确通信 IP地址: ...
- WinSock网络编程基础(2)客户端
接下来说一下如何用WinSock创建基于TCP/IP模型的客户端和服务器. TCP可以提供两个计算机间可靠无误的数据传输,应用程序使用TCP通信时,会在两台计算机之间建立一个虚拟连接,连接之后计算机之 ...
- MFC:Socket编程—TCP服务端和多个客户端通信
前言 MFC是微软基础类库,于 C++ 对于 C语言来说,MFC对于window API ,MFC 就相当于C++,window API 相当于C.MFC 封装了 window API 使用起来更加的 ...
最新文章
- AWS pytorch-model API
- 【2017-11-26】Linq表连接查询
- Python使用aiohttp异步爬取糗事百科
- vc6.0mfc中单选按钮如何分组_按钮系列02-搞定按钮和选框的14个秘诀
- python删除对象引用_使用Python删除内存中的对象
- 计算机英语四六级考试时间,英语四六级口语考试时间
- 基于JAVA+Servlet+JSP+MYSQL的教室资源管理系统
- 堆结构导致数据文件不能收缩
- PPP 守护进程 RCE 漏洞已存在17年,可控制几乎所有的 Linux 系统
- UVA 1329 Corporative Network(并查集:路径压缩)
- log日志java web_Java Web log4j (日志)
- 2017软件构造3.3
- 使用PE安装纯净版win7
- 工作一年时期的土豆总结——复杂度和困难度
- python实现输出日历_python实现输出日历
- python笔记005-字符串-列表-元组
- 如何解密Token?
- 电阻 电容 电感 磁珠的选型总结对比
- 手机怎样测海拔高度?手机测量海拔的方法分享。
- 华为p40pro android11,华为P40Pro上手对比iPhone11Pro:差距拉开、黑马逆袭!
热门文章
- fcpx插件:21个模拟相机取景器数码屏显效果预设Camera Rec
- kayui进行添加_layui实现点击按钮添加一行的方法
- scsi协议_存储协议有哪些类型?常见存储协议分析
- postMessage跨域、跨iframe窗口消息传递
- java stringbuffer长度限制_Java中的String、StringBuffer和StringBuilder
- Web前端笔记-字符串自适应tip提示框(适应大小自动换行JS中静态工具类实现)思路
- Redis工作笔记-spring-data-redis的基本使用
- HTML期末作业-旅游网页作业Html+css+Bootstarp
- 计算机板报设计简单,计算机板报制作
- Django之Mode的外键自关联和引用未定义的Model