---恢复内容开始---

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架构通信的更多相关文章

  1. QT编写TCP入门+简单的实际项目(附源程序)

    我个人感觉学习QT不需要那么深入的了解,因为我就是编写一下界面来实现理想的功能而已,我不是靠这个吃饭,当然以后要是从事这个方向那就好好深入底层好好学了. 学习QT的TCP:第一步:去百度看看TCP的介 ...

  2. 回归Qt——写在Qt5.10发布之日

    今天偶然看到一条关于Qt5.10发布的消息,发现Qt经历了诺基亚风波之后发展得依然良好,感到很欣慰.回头看上次关注Qt技术还是2011年,那时候用Qt4.7做一个小项目,对于一个写Win32界面和MF ...

  3. qt5.3+vs2013乱码

    解决qt5.3+vs2013乱码,在main函数之前加入 #if _MSC_VER >= 1600 #pragma execution_character_set("utf-8&quo ...

  4. TCP/IP协议原理与应用笔记10:TCP/IP协议族

    1. 协议族视图如下:(这里我们列举重要的,并不是所有的) (1)网络接入层(数据链路层 和 物理层): 通过接入的物理网络的 功能 和 覆盖范围 进行分析划分为: •LANs :局域网(Local ...

  5. 详解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 ...

  6. Qt5.10.1 在windows下vs2017静态编译

    1.在计算机上安装python库和perl库(因为后续的静态编译需要用到这两种语言),可以在命令行敲击“python”和“perl -v”检查是否安装成功. 2.修改msvc-desktop.conf ...

  7. activiti 用户手册中 10分钟 小例子 简单代码搭建 及 其中的 各种坑

    看mossle的 5.16 用户手册中的  快速起步:10分钟教程 想自己跑一下,虽然官方文档已经写的非常详细了,但是实际操作中还是遇到各种坑,这里记录下来. 首先官网下载最新的 5版本 full G ...

  8. VS2017 编译 QT5.10.1 X64位 静态库 MT

    参考文章 https://blog.csdn.net/Devout_programming/article/details/78827112 准备工作* Supported compiler (Vis ...

  9. OpenCV-3.4.2基于Qt-5.10.1的编译

    OpenCV-3.4.2基于Qt-5.10.1的编译 由于本人在使用CMake和MinGW编译OpenCV是遇到了很多问题,在这里记录下来.至于所需软件的安装和相应环境变量的设置,网上有很多详细的教程 ...

随机推荐

  1. Python编写的记事本小程序

    用Python中的Tkinter模块写的一个简单的记事本程序,Python2.x和Python3.x的许多内置函数有所改变,所以以下分为Python2.x和Python3.x版本. 一.效果展示: 二 ...

  2. elk的一些零碎知识

    1.elasticsearch检查是否健康 http://12.20.511.141:9200/_cat/health?v 绿色表示一切正常, 黄色表示所有的数据可用但是部分副本还没有分配,红色表示部 ...

  3. laravel(lumen)配置读写分离后,强制读主(写)库数据库,解决主从延迟问题

    在Model里面加上下面这句,强制读主(写)库数据库,解决主从延迟问题. public static function boot() { //清空从连接,会自动使用主连接 DB::connection ...

  4. Python正则表达式的re库一些用法(上)

    1.查找文本中的模式 search()函数取模式和要扫描的文本作为输入,找到这个模式时就返回一个match对象.如果没有找到模式,search()就返回None. 每个match对象包含有关匹配性质的 ...

  5. SpringBoot 2.0 pom.xml 配置(热启动)

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...

  6. 机器学习环境搭建-Pycharm

    刚刚开始学习机器学习,遇到了很多的问题,尤其是搭建环境让我觉得脑袋特别疼.我用的是win8 64位操作系统,硬盘小的可怜.开始我也跟着下载了anaconda,后来发现anaconda一点儿不像说的那么 ...

  7. numpy 库使用

    numpy 库简单使用 一.numpy库简介 Python标准库中提供了一个array类型,用于保存数组类型的数据,然而这个类型不支持多维数据,不适合数值运算.作为Python的第三方库numpy便有 ...

  8. Struts框架原理及应用

    Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher.业务控制器Action和用户实现的企业业务逻辑组件. 核心控制器FilterDispatcher是Struts ...

  9. mysql安装(centos 7)

    1.安装依赖 yum install -y cmake make gcc gcc-c++ libaio ncurses ncurses-devel cd /usr/local/src 链接:https ...

  10. Jira7.10.1在Windows环境下的安装和配置

    jira安装的环境准备   1.   jira7.10的运行是依赖java环境的,也就是说需要安装jdk并且要是1.8以上版本: Java -version   2.  还需要为jira创建对应的数据 ...