这里写目录标题
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();