.pro 文件中加入:QT+=network

在Qt中实现TCP/IP服务器端通信的流程:

1.创建监听套接字,QTcpServer

2.将监听套接字设置为监听模式, listen

3.等待并接受客户端请求,可以通过QTcpServer提供的void    newConnection()信号来检测是否有连接请求,如果有可以在对应的槽函数中调用nextPendingConnection函数获取到客户端的Socket信息(返回值为QTcpSocket*类型指针),通过此套接字与客户端之间进行通信。此时会返回一个通信套接字,QTcpSocket

4.接收或者向客户端发送数据

5.接收数据:使用read()或者readAll()函数

6.发送数据:使用write()函数

监听套接字和通信套接字的区别:

在服务端包含两种套接字QTcpServer,QTcpSocket. QTcpServer用于listen()监听模式,监听哪个IP,从哪个端口接入。QTcpSocket用于两者之间的真正通信,当两者完成连接后,各个都拥有一个QTcpSocket,如:sock1,sock1,那么这两个通信套接字等同于各自的手机号码,用于通信使用。

客户端通信流程:

1.创建套接字

2.连接服务器,可以使用QTcpSocket类的connectToHost()函数来连接服务器。

3.向服务器发送或者接受数据

如图:

解析:当服务端处于监听模式时(listen),客户端通过connectToHost请求连接,此时服务端就是触发信号newConnection(系统给出,非自拟),调用对应的槽函数(可自拟,或直接使用Lambda表达式)。服务端连通后,客户端就会立即触发信号connected.说明两者之间已完成连接,彼此可以利用write发出信息,利用read,readAll接受信息。

服务器

TcpSever.h

#ifndef TCPSEVER_H

#define TCPSEVER_H

#include <QWidget>

#include <QTcpServer>

#include <QTcpSocket>

namespace Ui {

class Widget;

}

class Widget : public QWidget

{

Q_OBJECT

public:

explicit Widget(QWidget *parent = 0);

~Widget();

private slots:

void on_pushButton_clicked();       //发送按钮

void on_pushButton_2_clicked();     //关闭通信

private:

Ui::Widget *ui;

QTcpServer *m_server;           //监听套接字

QTcpSocket *m_ServerSock;       //通信套接字

};

#endif // TCPSEVER_H

TcpSever.cpp

#include "TcpSever.h"

#include "ui_widget.h"

#include <QTime>

#include <QDebug>

Widget::Widget(QWidget *parent) :

QWidget(parent),

ui(new Ui::Widget)

{

ui->setupUi(this);

//监听套接字,指定父对象,让其自动回收空间

m_server=new QTcpServer(this);

m_ServerSock=NULL;

this->setWindowTitle("服务器端口:888");

//监听IP地址,指定端口

m_server->listen(QHostAddress::Any,888);

//客户端接入触发

connect(m_server,&QTcpServer::newConnection,

[=]()   mutable

{

if(m_ServerSock==NULL)

{

//取出建立好的连接的套接字

m_ServerSock=m_server->nextPendingConnection();

//获取对方的IP,端口号

QString strIP=m_ServerSock->peerAddress().toString();

quint16 uPort=m_ServerSock->peerPort();

//newConnection信号被触发后,显示有客户端接入

//m_ServerSock->write("连接成功!!!");

ui->edit_Recv->setText(QString("[%1,%2]接入成功").arg(strIP).arg(uPort));

//通信

connect(m_ServerSock,&QTcpSocket::readyRead,

[=]()   mutable

{

//接受对方发来的信息

QByteArray byteBuf=m_ServerSock->readAll();

//获取本地时间

QTime time=QTime::currentTime();

//显示在消息框,append不断追加

QString strTemp=time.toString()+QString("::")+QString(byteBuf);

ui->edit_Recv->append(QString(strTemp));

}

);

}

}

);

}

Widget::~Widget()

{

delete ui;

delete m_server;

m_server=NULL;

m_ServerSock=NULL;

}

void Widget::on_pushButton_clicked()

{

if(m_ServerSock!=NULL)

{

//获取要发送的信息

QString strSend=ui->edit_Send->toPlainText();

//发送

m_ServerSock->write(strSend.toUtf8().data());

//清空发送框的内容

//ui->edit_Send->clear();

}

}

void Widget::on_pushButton_2_clicked()

{

if(m_ServerSock!=NULL)

{

//断开连接

m_ServerSock->disconnectFromHost();

m_ServerSock->close();

m_server->close();

}

}

同一程序添加两个窗口,且有设计器。新建一个文件,但不是C++类文件,而是QT且带有界面类的,最后在main中使用show()直接显示。如下图:

客户端

tcpclient.h

#ifndef TCPCLIENT_H

#define TCPCLIENT_H

#include <QWidget>

#include <QTcpSocket>

#include <QHostAddress>

namespace Ui {

class TcpClient;

}

class TcpClient : public QWidget

{

Q_OBJECT

public:

explicit TcpClient(QWidget *parent = 0);

~TcpClient();

private slots:

void on_connect_clicked();          //请求服务器连接

void on_send_clicked();             //发送信息

void on_close_clicked();            //关闭通信

private:

Ui::TcpClient *ui;

QTcpSocket *m_ClientSock;           //通信套接字

};

#endif // TCPCLIENT_H

tcpclient.cpp

#include "tcpclient.h"

#include "ui_tcpclient.h"

#include <QDebug>

#include <QTime>

TcpClient::TcpClient(QWidget *parent) :

QWidget(parent),

ui(new Ui::TcpClient)

{

ui->setupUi(this);

this->setWindowTitle("客户端");

//便于调试

//ui->IP->setText("127.0.0.1");

//ui->Port->setText("888");

//分配空间,指定父对象

m_ClientSock=new QTcpSocket(this);

//与服务器连接好触发

connect(m_ClientSock,&QTcpSocket::connected,

[=]() mutable

{

ui->clientRecv->setText("成功连接!!!");

//通信

connect(m_ClientSock,&QTcpSocket::readyRead,

[=]()

{

//获取对方发来的信息

QByteArray byteBuf=m_ClientSock->readAll();

//获取本地时间

QTime time=QTime::currentTime();

//显示在消息框,append不断追加

QString strTemp=time.toString()+QString("::")+QString(byteBuf);

ui->clientRecv->append(strTemp);

}

);

}

);

//    connect(m_ClientSock,QTcpSocket::disconnected(),

//            []()

//            {

//                m_ClientSock->disconnectFromHost();

//                m_ClientSock->close();

//            }

//    )

}

TcpClient::~TcpClient()

{

delete ui;

delete m_ClientSock;

m_ClientSock=NULL;

}

void TcpClient::on_connect_clicked()

{

//设置对方的IP,端口

QString strIP=ui->IP->text();

qint16 uPort=ui->Port->text().toInt();

//请求服务器连接

m_ClientSock->connectToHost(QHostAddress(strIP),uPort);

}

void TcpClient::on_send_clicked()

{

//获取要发送的信息

QString strSend=ui->clientSend->toPlainText();

//发送

m_ClientSock->write(strSend.toUtf8().data());

//清空

//ui->clientSend->clear();

}

void TcpClient::on_close_clicked()

{

//断开连接

m_ClientSock->disconnectFromHost();

m_ClientSock->close();

}

main.cpp

#include "TcpSever.h"

#include <QApplication>

#include "tcpclient.h"

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

Widget w;

w.show();

TcpClient c;

c.show();

return a.exec();

}

程序结果图:

23TCP通信的更多相关文章

  1. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

  2. 笔记:Binder通信机制

    TODO: 待修正 Binder简介 Binder是android系统中实现的一种高效的IPC机制,平常接触到的各种XxxManager,以及绑定Service时都在使用它进行跨进程操作. 它的实现基 ...

  3. .NET 串口通信

    这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通 ...

  4. MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信

    MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...

  5. 多线程的通信和同步(Java并发编程的艺术--笔记)

    1. 线程间的通信机制 线程之间通信机制有两种: 共享内存.消息传递.   2. Java并发 Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式执行,通信的过程对于程序员来说是完全透 ...

  6. 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)

    搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...

  7. 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.1

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

  8. TCP通信

    //网络套接字编程实例,服务器端,TCP通信. #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib") #inc ...

  9. JAVA通信系列一:Java Socket技术总结

    本文是学习java Socket整理的资料,供参考. 1       Socket通信原理 1.1     ISO七层模型 1.2     TCP/IP五层模型 应用层相当于OSI中的会话层,表示层, ...

随机推荐

  1. Windows 下安装 Python3

    可以使用两种方式安装 Python3,一种是直接去官网下载安装包,然后进行安装即可:另一种是通过安装 Anaconda 来安装 Python3, Anaconda 提供了 Python 的科学计算环境 ...

  2. Ajax轮询——定时的通过Ajax查询服务端

    概念:轮询(polling):客户端按规定时间定时向服务端发送ajax请求,服务器接到请求后马上返回响应信息并关闭连接. test.html     //前端代码 <html> <h ...

  3. 如何搭建本地WordPress

    今天就来介绍一下如何在Windows下搭建本地WordPress. 安装前准备 1.正常的电脑 2.PHPNow  http://www.phpnow.org 这里面的PHPNow环境包其实包含了常见 ...

  4. java 集合之HashMap

    原文出处http://zhangshixi.iteye.com/blog/672697 1.    HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操 ...

  5. SignalR实现在线聊天室功能

    一.在线聊天室 1.新建解决方案 SignalROnlineChatDemo 2.新建MVC项目 SignalROnlineChatDemo.Web (无身份验证) 3.安装SignalR PM> ...

  6. 【BZOJ1801】[Ahoi2009]chess 中国象棋 DP

    [BZOJ1801][Ahoi2009]chess 中国象棋 Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮 ...

  7. Android 性能测试工具- GT

    GT(随 身调)是APP的随身调测平台,它是直接运行在手机上的“集成调测环境”(IDTE, Integrated Debug&Test Environment).利用GT,仅凭一部手机,无需连 ...

  8. 【git】------git的基本介绍及linux的基本命令------【巷子】

    001.git简介 git是一款开源的分布式版本控制工具 在世界上所有的分布式版本控制工具中,git是最快.最简单.最流行的 git的起源 作者是Linux之父:Linus Benedict Torv ...

  9. 170511、Spring IOC和AOP 原理彻底搞懂

    Spring提供了很多轻量级应用开发实践的工具集合,这些工具集以接口.抽象类.或工具类的形式存在于Spring中.通过使用这些工具集,可以实现应用程序与各种开源技术及框架间的友好整合.比如有关jdbc ...

  10. SaltStack部署redis主从

    需求: 一,部署redis主从,一台主一台从 二,redis监听自己的IP地址,而不是0.0.0.0 主:安装,配置,启动 从:安装,配置,启动,主从