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

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. js实现农历时间代码

    var dNow = new Date(); var CalendarData=new Array(100); var madd=new Array(12); var tgString="甲 ...

  2. linux 虚拟机配置固定ip

    参考这边博客: https://blog.csdn.net/u014466635/article/details/80284792 但是这个有个小问题,就是没有配置dns,导致连不上公网 /etc/s ...

  3. spring(spring mvc)整合WebSocket案例(获取请求参数)

    开发环境(最低版本):spring 4.0+java7+tomcat7.0.47+sockjs 前端页面要引入: <script src="http://cdn.jsdelivr.ne ...

  4. Tikhonov regularization 吉洪诺夫 正则化

    这个知识点很重要,但是,我不懂. 第一个问题:为什么要做正则化? In mathematics, statistics, and computer science, particularly in t ...

  5. Judy Beta Postmortem

    设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 与Alpha阶段相同,我们的软件要解决的Julia程序的dubug功能.问题定义得比较清楚,具体分 ...

  6. Git clone出现SSL certificate problem

    1 可以在cmd下,设置 git config --global http.sslVerify false git clone  XXX 即可. 2 TortoiseGit设置 打开TortoiseG ...

  7. Properties类

    简介: Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这 ...

  8. PAT B1023

    PAT B1023 标签(空格分隔): PAT 解决方法:贪心法 #include <cstdio> int main() { int count[10]; for (int i = 0; ...

  9. clusterware启动顺序——CSS

    CSS层面 1.ocssd.bin守护进程 该层面最主要的工作就是启动ocssd.bin守护进程.使本地节点能够成功地加入集群.ocssd.bin守护进程的启动过程可以通过以下的图形进行描述. ::: ...

  10. effective java——32用EnumSet代替位域

    什么是位域?为什么用到它?先来看一个例子: public class Test { public static final byte STYLE_BOLD = 1<<0; // 1 pub ...