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

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. docker网络

    docker网络   Docker 允许通过外部访问容器或容器互联的方式来提供网络服务. 端口映射允许外部访问容器 --link 容器互联 容器桥接网络 .通过--link容器通信,给test2添加一 ...

  2. 虚拟机使用ceph-deploy安装ceph

    参考: ceph官网介绍 使用ceph-deploy安装Ceph 12.x 安装虚拟机 首先安装虚拟机环境,虚拟机安装这里不做介绍,本实验使用的镜像为CentOS-7-x86_64-Everythin ...

  3. Python随笔--对象

    组合的用法:

  4. phpstrom mac 快捷键

    对应键 ⌘——Command ⌃ ——Control ⌥——Option/Alt ⇧——Shift ⇪——Caps Lock fn——功能键就是fn 编辑 Command+alt+T 用 (if..e ...

  5. 团队项目需求心得——慢阻肺疾病管理APP

    一.项目介绍: 先上图: 这是我们小组开发项目的系统构成图. 本项目研发面向家庭/社区,对稳定期中慢阻肺患者病情和环境全方位监测.简单病情趋势分析和患者行为干预,并且提供患者与家庭医生和专家沟通渠道的 ...

  6. 定义一个Map集合,key和value不规定类型,任意放入数据,用keySet()和 entrySet()两种方式遍历出Map集合的数据

    package com.lanxi.demo1_1_1; import java.util.HashMap; import java.util.Iterator; import java.util.M ...

  7. spring-boot整合mybatis(web mysql logback配置)

    pom.xml相关的配置说明. 配置文件看着比价多,在创建spring-boot项目的时候,自需要添加web,mysql,mybatis三个选项即可 <?xml version="1. ...

  8. jar 包启动脚本

    #!/bin/bash JAVA_HOME=/usr/java/default #java虚拟机启动参数 JAVA_OPTS="-server -Xms800m -Xmx800m -Xmn2 ...

  9. Docker搭建LNMP网站平台

    1.自定义网络 [root@linux-docker01 ~]# docker network create lnmp 67e7e0736b2c58f8f81eed50130803b34be0583f ...

  10. python的标准数据类型

    python有5种标准的数据类型 1. number(数字) int(有符号的整形) long(长整[也可以代表八进制和16进制]) float(浮点型) complex(复数类型) 2.string ...