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是遇到了很多问题,在这里记录下来.至于所需软件的安装和相应环境变量的设置,网上有很多详细的教程 ...
随机推荐
- Saiku控制页面展示的数据过长自动换行(二十四)
Saiku控制页面展示的数据过长自动换行 目前用到saiku来展示数据,发现数据文本过长也不会自动换行,然而用户那边又需要换行(会好看些),所以就来改一改源码啦 首先我们使用谷歌浏览器 inspect ...
- JAVAEE第四周
一.定义 Async函数是Generator函数的语法糖,但相较来说比Generator函数更强大一些.主要用于1解决一次异步调用异步函数的问题,即当第一个异步调用结束后,再调用第二个异步函数:等第二 ...
- Spring LazyInitializatoinException
今天做project创建了一个新的类A,这个新类包含了一个另外一个类B的Set.B类包含了另外一个C类的集合... public class A{ @Id int id; @OneToMany(fet ...
- chrome插件学习笔记
manifest.json { "name": "test1", "description": "test1", &qu ...
- JSP学习(1)---JSP基本原理
一.JSP的本质 其本质是Servlet,web应用中的每个jsp页面都会由servlet容器生成对应的servlet. 在tomcat中,jsp生成的servlet在work文件夹下: 原jsp文件 ...
- 什么是 Message Queue
Message Queue 是一种非同步的从一个服务到另一个服务的交流形式, 被用于无服务器架构和微服务架构中. Messages 被储存在一个队列中直到被处理了或被删除. 每个Messages只会被 ...
- cocos2dx 3.17.1 导演类
进入导演类的头文件,首先看到的是一些头文件的引用:CCPlatformMacros(适配),CCRef(继承的父类),CCVector(3.0以后的新向量),CCScene(场景),CCMath(数学 ...
- Windows Server 2012系统上安装.net framework3.5教程
1.先下载WIN2012R2安装NET3.5的专用数据源 https://pan.baidu.com/s/1bqiUTyR 提取码h09k 并解压,比如解压到桌面,解压后的路径为C:\Users\Ad ...
- Mysql基础教程之mysql 设置参数常用方法
1)设置mysql的全局方法,设置完立刻重启mysqlvim /etc/my.cnf[mysqld]interactive_timeout=1800wait_timeout=1800 全局永久生效现在 ...
- 2018-CVTE中央研究院-自然语言处理算法工程师-电话初面问题
楼主NLP初学者一名,有幸参加2018年CVTE中央研究院自然语言处理电话面试,问题总结如下: 1.详细的介绍自己的学术论文(感觉他们非常重视这块),会问你网络的具体构造,注意力机制如何计算以及为何你 ...