QT5.10+VS2013 TCP 一对一简单C/S架构通信
---恢复内容开始---
QT~俺老孙又回来啦~
买的那本书上面关于tcp的内容就七八页,而且都是过于简单的东西,想进一步就要度娘很久很麻烦,还是喜欢看书(嘿嘿嘿~)
大致的思路就是两个项目,一个client一个server
server监听端口,client建立socket,向目标IP端口发数据.....
先放server的
.h
serverclass tcp_test : public QMainWindow
{
Q_OBJECT
private:
QLabel *LabListen;
QLabel *LabSocketState;
QTcpServer *tcpServer;
QTcpSocket *tcpSocket; QString getLocalIP();
public:
tcp_test(QWidget *parent = Q_NULLPTR);
private slots:
void onNewConnection();
void onSocketStateChange(QAbstractSocket::SocketState socketState);
void onClientConnected();
void onClientDisconnevted();
void onSocketReadyRead(); void slot_actStart();
void slot_actStop();
void slot_btnSend();
private:
Ui::tcp_testClass ui;
}
.cpp
#include "tcp_test.h" tcp_test::tcp_test(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
LabListen = new QLabel(QString::fromLocal8Bit(" 监听状态:"));
LabListen->setMinimumWidth();
ui.statusBar->addWidget(LabListen); LabSocketState = new QLabel(QString::fromLocal8Bit("Socket状态:"));
LabSocketState->setMinimumWidth();
ui.statusBar->addWidget(LabSocketState); QString localIP = getLocalIP();
this->setWindowTitle("Server -- local IP :" + localIP);
ui.comboIP->addItem(getLocalIP()); ui.btnSend->setEnabled(false); tcpServer = new QTcpServer(this); connect(tcpServer, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
connect(ui.actStart, SIGNAL(clicked()), this, SLOT(slot_actStart()));
connect(ui.actStop, SIGNAL(clicked()), this, SLOT(slot_actStop()));
connect(ui.btnSend, SIGNAL(clicked()), this, SLOT(slot_btnSend()));
} QString tcp_test::getLocalIP()
{
QString hostName = QHostInfo::localHostName();
QHostInfo hostInfo = QHostInfo::fromName(hostName);
QString localIP = "";
QList<QHostAddress> addList = hostInfo.addresses(); if (!addList.isEmpty())
{
for (int i = ; i < addList.count(); i++)
{
QHostAddress aHost = addList.at(i);
if (QAbstractSocket::IPv4Protocol == aHost.protocol())
{
localIP = aHost.toString();
break;
}
}
}
return localIP;
} void tcp_test::slot_actStart()
{
QString IP = ui.comboIP->currentText();
quint16 port = ui.spinBox->value();
QHostAddress addr(IP);
tcpServer->listen(addr, port);
ui.textBrowser->append(QString::fromLocal8Bit("**开始监听**"));
ui.textBrowser->append(QString::fromLocal8Bit("**服务器地址:") + tcpServer->serverAddress().toString());
ui.textBrowser->append(QString::fromLocal8Bit("**服务器端口:") + QString::number(tcpServer->serverPort()));
ui.actStart->setEnabled(false);
ui.actStop->setEnabled(true);
LabListen->setText(QString::fromLocal8Bit("监听状态:正在监听"));
} void tcp_test::onNewConnection()
{
tcpSocket = tcpServer->nextPendingConnection();
connect(tcpSocket,SIGNAL(connected()),this,SLOT(onClientConnected()));
onClientConnected();
connect(tcpSocket,SIGNAL(disconnected()),this,SLOT(onClientDisconnevted()));
connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
onSocketStateChange(tcpSocket->state());
connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead())); ui.btnSend->setEnabled(true);
} void tcp_test::onClientConnected()
{
ui.textBrowser->append("**client socket connected");
ui.textBrowser->append("**peer address:" + tcpSocket->peerAddress().toString());
ui.textBrowser->append("**peer port:" + QString::number(tcpSocket->peerPort()));
} void tcp_test::onClientDisconnevted()
{
ui.textBrowser->append("**client socket disconnected");
ui.btnSend->setEnabled(false);
tcpSocket->deleteLater();
} void tcp_test::onSocketStateChange(QAbstractSocket::SocketState socketState)
{
switch (socketState)
{
case QAbstractSocket::UnconnectedState:
LabSocketState->setText(QString::fromLocal8Bit("socket状态:UnconnectedState")); break;
case QAbstractSocket::HostLookupState:
LabSocketState->setText(QString::fromLocal8Bit("socket状态:HostLookupState")); break;
case QAbstractSocket::ConnectingState:
LabSocketState->setText(QString::fromLocal8Bit("socket状态:ConnectingState")); break;
case QAbstractSocket::ConnectedState:
LabSocketState->setText(QString::fromLocal8Bit("socket状态:ConnectedState")); break;
case QAbstractSocket::BoundState:
LabSocketState->setText(QString::fromLocal8Bit("socket状态:BoundState")); break;
case QAbstractSocket::ClosingState:
LabSocketState->setText(QString::fromLocal8Bit("socket状态:ClosingState")); break;
case QAbstractSocket::ListeningState:
LabSocketState->setText(QString::fromLocal8Bit("socket状态:ListeningState")); break;
}
} void tcp_test::slot_actStop()
{
if (tcpServer->isListening())
{
tcpServer->close();
ui.actStart->setEnabled(true);
ui.actStop->setEnabled(false);
LabListen->setText(QString::fromLocal8Bit("监听状态:已停止监听"));
}
} void tcp_test::slot_btnSend()
{
if (!tcpServer->isListening() )
{
return;
}
QString msg = ui.editMsg->text();
QString msg2loacl8 = msg;
QByteArray str = msg.toUtf8();
ui.textBrowser->append("[out] " + msg2loacl8);
ui.editMsg->clear();
ui.editMsg->setFocus();
str.push_back('\n'); tcpSocket->write(str);
} void tcp_test::onSocketReadyRead()
{
while (tcpSocket->canReadLine())
{
ui.textBrowser->append("[in] " + tcpSocket->readLine());
}
}
之前用创建的slot函数命名是这样的 : on_btnStart_clicked()
没想到这样命名的话,不用connect连接了,点击相关控件就直接调用这个槽函数了.....
真没想到....
客户端的等等我再改一下
有错误和建议请加我的QQ:920209178
QT5.10+VS2013 TCP 一对一简单C/S架构通信的更多相关文章
- QT编写TCP入门+简单的实际项目(附源程序)
我个人感觉学习QT不需要那么深入的了解,因为我就是编写一下界面来实现理想的功能而已,我不是靠这个吃饭,当然以后要是从事这个方向那就好好深入底层好好学了. 学习QT的TCP:第一步:去百度看看TCP的介 ...
- 回归Qt——写在Qt5.10发布之日
今天偶然看到一条关于Qt5.10发布的消息,发现Qt经历了诺基亚风波之后发展得依然良好,感到很欣慰.回头看上次关注Qt技术还是2011年,那时候用Qt4.7做一个小项目,对于一个写Win32界面和MF ...
- qt5.3+vs2013乱码
解决qt5.3+vs2013乱码,在main函数之前加入 #if _MSC_VER >= 1600 #pragma execution_character_set("utf-8&quo ...
- TCP/IP协议原理与应用笔记10:TCP/IP协议族
1. 协议族视图如下:(这里我们列举重要的,并不是所有的) (1)网络接入层(数据链路层 和 物理层): 通过接入的物理网络的 功能 和 覆盖范围 进行分析划分为: •LANs :局域网(Local ...
- 详解QT5.10.0搭载OpenCV3.4.0环境配置步骤说明
一.准备工作: 1下载Qt5.10.0 和 Qt Creator 4.5.0软件(http://download.qt.io/official_releases/qt/) 2.下载opencv3.40 ...
- Qt5.10.1 在windows下vs2017静态编译
1.在计算机上安装python库和perl库(因为后续的静态编译需要用到这两种语言),可以在命令行敲击“python”和“perl -v”检查是否安装成功. 2.修改msvc-desktop.conf ...
- activiti 用户手册中 10分钟 小例子 简单代码搭建 及 其中的 各种坑
看mossle的 5.16 用户手册中的 快速起步:10分钟教程 想自己跑一下,虽然官方文档已经写的非常详细了,但是实际操作中还是遇到各种坑,这里记录下来. 首先官网下载最新的 5版本 full G ...
- VS2017 编译 QT5.10.1 X64位 静态库 MT
参考文章 https://blog.csdn.net/Devout_programming/article/details/78827112 准备工作* Supported compiler (Vis ...
- OpenCV-3.4.2基于Qt-5.10.1的编译
OpenCV-3.4.2基于Qt-5.10.1的编译 由于本人在使用CMake和MinGW编译OpenCV是遇到了很多问题,在这里记录下来.至于所需软件的安装和相应环境变量的设置,网上有很多详细的教程 ...
随机推荐
- aspectj编程简介
现在java生态中spring大行其道,一般使用aspectj进行切面编程使用注解方式实现,比较少使用原生的aspectj编程,网上的资料也比较少.最近工作中需要封装redisson客户端提供统一的r ...
- java ee 思维导图
http://download.csdn.net/download/g290095142/10149996 这是原地址,我觉得很棒,就下载下来用xmind看了看,发现很全面的.
- Filebeat占用内存和CPU过高问题排查
经反馈,新部署的服务器上filebeat占用的cpu过高,且内存只增不减. 而据我了解filebeat非常轻量级,正常情况下占用的资源几乎都能忽略不计,所以怀疑是filebeat本身出了问题. 第一时 ...
- Problem 5: Smallest multiple
2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any rema ...
- Intellij IDEA xxx.properties变成纯文本模式解决方案
今天在创建xxx.properties的时候不知道按到了哪里,结果让它编程了纯文本模式,重命名这个文件或者删掉,重新创建这个同名文件,换一个项目,始终是文本文件类型,就估计不是项目问题,是intell ...
- unsigned char idata temp[8];
unsigned char 是无符号字符,单字节 idata 表示变量位于内部数据区,外部数据区是 xdata,代码区是 codeidata:固定指前面0x00-0xff的256个RAM,其中前128 ...
- jmeter之关联
前言:当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理,Jmeter可以通过“后置处理器”中的“正则表达式提取器”来处理关联. 一.后置处理器-------正则 ...
- 提示Unused default export错误,如何解决
问题描述如下: 这个错误提示其实是webstorm的变量语法检查提示,修改一下它的配置就好了. 1.点击Webstorm右下角的小人,点击Configure inspections 2.在搜索框中输入 ...
- key单片机按键抖动
//write by:cyt //Time:2017-2-10 //Porject Name:key shake_destory #include<reg51.h> #define GPI ...
- A The Empire Age
1月28日 Description 帝国时代3是一款十分刺激的RTS游戏.你需要控制自己的一块殖民地,发展殖民地的经济和军事,最终打败其他殖民地.小L是这个游戏的狂热爱好者.一次小L打算打AI试试身手 ...