QT之TCP连接通信过程

tcp通信连接简单步骤说明

tcp连接—服务端

1、这里需要用到QTcpServer,目的是监听套接字
2、监听
3、被触发的newconnection(),这里会取出建立好连接的套接字QTcpSocket,真正的通信套接字
4、发送数据,write,如果数据传送成功,对方的通信套接字会触发readtread(),需要在对应的槽函数做接受处理(这里对方是客户端)

tcp连接—客户端

1、这里需要用到QTcpSocket
2、connectToHost(),这是主动建立连接,如果连接成功就会触发newConnection()的信号
3、发送数据write,如果数据传送成功,对方的通信套接字会触发readyread(),需要在对应的槽函数中做接受处理(这里对方是服务器)

注意:

1、如果成功和对方建立好连接,通信套接字会自动触发connected();
2、如果对方主动断开连接,通信套接字就会自动触发disconnected();
3、用到网络通信,所以需要加上QT +=network
4、飞秋就是使用tcp进行文件发送的。

实操讲解

tcp连接—服务端

1、布局展示:

在这里插入图片描述

2、头文件

1、现在.pro内容里面写上QT+=network。
头文件必须在项目文件,pro中指定查看,不然会出错,系统不知道从哪里找,太多了。
2、添加完之后,编译不运行。
检查是否可使用。
3、服务器.h中添加头文件

#include<QTcpServer>//监听套接字
#include<QTcpSocket>//通信套接字

4、服务器.h中添加私有变量(或者指针)

QTcpServer *tcpServer;//监听套接字
QTcpSocket *tcpSocket;//通信套接字

当想用到多个通信连接的时候,(比如一个服务器连接多个客户端–qq的情况),这里设置通信套接字应该是多个。

QList<QTcpSocket *> tcpsocket;//tcp通信的socket
3、执行文件.cpp

构造函数中:
ps:在第三步之前,需要在.pro中添加CONFIG+=C++11;

//第一步:给建立的监听套接字中赋值空间,指定监听套接字,指定父对象this,让他自动回收空间
tcpServer=new QTcpServer(this);
//第二步:监听之后,进行绑定操作,QHostAddress::Any绑定我当前网卡所有的ip地址,8888是指定了端口。
tcpServer->listen(QHostAddress::Any,8888);
//第三步:
//建立连接
connect(tcpServer,&QTcpServer::newConnection,
	[=]()
	{
	//取出建立好的连接的套接字
	tcpSocket=tcpServer->nextPendingConnection();//取当前最近的一个。
	//获取连接的ip和端口
	QString ip=tcpSocket->peerAddress().toString();
	qint16 port=tcpSocket->peerPort();
	//组成一个包方便输出
	QString temp=QString("{%1:%2}:连接成功").arg(ip).arg(port);
	//放在当前窗口中显示出来
	ui->textEditRead->setText(temp);

	//传递数据,这里也有一个connect
	//建立连接,客户端会来连接通信套接字,会直接触发readyRead(),只要有数据读就会触发,这里用了lambda表达式。
	connect(tcpSocket,&QTcpSocket::readyRead,
		[=]()
		{
		//从通信套接字中取出内容
		QByteArray array=tcpSocket->readAll();
		//将读取到的内容追加显示到界面的只读read窗口中
		ui->textEditRead->append(array);
		});
	
	});


断开连接:
设定一个按钮是断开连接,转到槽,然后选择clicked()点击
。这里设定的是服务器主动和客户端断开连接

//主动和客户端断开连接
tcpSocket->disconnectFromHost();
tcpSocket->close();

注意:判断为空
点击断开连接之后,会报错,因为构造函数会有tcpserver和tcpsocket,关闭之后,还有读取他们的内容。
解决办法:
在构造函数中,将它们设置成null。
当等于null的时候,就证明是未连接的状态。

点击发送内容的按钮:
需要选中空间,转到槽,然后选择clicked()点击

//获取当前窗口的编辑区内容
QString str=ui->textEditWrite->toPlainText();
//给对方-客户端发送数据,使用的是套接字tcpSocket
//要转成utf-8字节的
tcpSocket->write(str.toUtf8().data());

tcp连接—客户端

1、界面设计

在这里插入图片描述

2、头文件.h

1、服务器.h中添加头文件

#include<QTcpSocket>//通信套接字

2、服务器.h中添加私有变量(或者指针)

QTcpSocket *tcpSocket;//通信套接字
3、执行文件.h

1、构造函数:
设置标题和忽视为null,并且分配空间

//和服务器类似,首先设定这个有值,且为空
tcpSocket=NULL;
//给变量分配空间,并且指定父函数
tcpSocket=new QTcpSocket(this);
//标题显示
setWindowTitle("客户端");

连接成功的提示,这里是触发连接成功的信号

//连接成功的提示
connect(tcpSocket,&QTcpSocket::connected,
[=]()
{
	ui->textEditRead->setText("成功和服务器建立连接");
});

收到发送过来数据的提示:

//收到发送的数据的提示
connect(tcpSocket.&QTcpSocket::readyRead,
[=]()
{
	//获取对方发送的内容
	QByteArray array=tcpSocket->readAll();
	//将内容追加到显示窗口中
	ui->textEditRead->append(array);
});

2、函数
点击连接按钮。同上clicked();

//获取服务器的ip和端口
QString ip=ui->lineEditIp->text();
qint16 port=ui->lineEditPort->text();

//主动和服务器建立连接
tcpSocket->connectHost(QHostAddress(ip),port);

点击发送数据的按钮,clicked();

//获取编辑框的内容
QString str=ui->textEditWrite->toPlainText();
//发送数据,这里注意格式转换是qstring格式的,qt都是。
tcpSocket->write(str.toUtf8().data());

断开连接的按钮,clicked();

//主动和对方断开连接
tcpSocket->disconnectFromHost();
tcpSocket->close();
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值