概述:
在Qt中tcp通信过程和linux系统编程中有点类似:
linux下的tcp通信
在Qt中的tcp通信:
过程详解:
1,服务端:
第一步创建监听套接字
第二步监听
监听的时候客户端会发送连接请求如果连接成功则回触发信号newConnection
我们使用信号槽机制捕捉到这个信号说明此时客户端以及连接到服务端(监听套接字)了,所以我们会在槽函数里面取出通信套接字进行通信。
第三步:通信(读写数据)
读数据的时候根据信号readyread
来读取。对于写数据可以使用一个button按钮来控制。
第四步:断开和此客户端连接。注意是关闭通信套接字而不是监听套接字。
2,客户端:
第一步:创建一个通信套接字
第二步:调用函数connectToHost
来连接服务端
第三步:连接成功后进行通信即可:
举例实现
实现两个窗口进行数据交互,使用Tcp
创建窗口如下:
创建窗口的时候使用ui即可,对于只需要显示的文本编辑区可以设置成为只读模式。
服务器代码:
按照上述步骤进行连接通信:
/*创建监听套接字*/
tcpServer = new QTcpServer(this);
/*监听*/
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);
/*显示客户端的IP和端口*/
ui->Display_Eddit->setText(temp);
connect(tcpSocket,&QTcpSocket::readyRead,[=]{
QByteArray array;
array = tcpSocket->readAll();
ui->Display_Eddit->append(array);
});
});
TcpSocket::~TcpSocket()
{
delete ui;
}
void TcpSocket::on_pushButton_send_clicked()
{
if(tcpSocket != NULL)
{
/*获取编辑区内容*/
QString str = ui->Edit->toPlainText();
/*给对方发送数据*/
tcpSocket->QIODevice::write(str.toUtf8().data());
ui->Edit->setText("");
}
}
void TcpSocket::on_pushButton_close_clicked()
{
if(tcpSocket != NULL)
{
/*主动和客户端断开连接*/
tcpSocket->disconnectFromHost();
tcpSocket->close();
tcpSocket = NULL;
}
}
对于数据通信和使用简单的文件驱动时候差别不是很大,在获取文本编辑区内容的时候使用toPlainText()
,对于write函数我们传参的时候转成char*再进行发送数据,需要注意在读数据的时候我们必须把连接readyread信号放在获取到通信套接字之后,不然会报错,是因为对于通信套接字没有分配空间。
对于客户端代码:
tcpSocket = new QTcpSocket(this);
/*连接成功信号*/
connect(tcpSocket,&QTcpSocket::connected,[=](){
ui->textEdit_read->setText("连接成功");
});
connect(tcpSocket,&QTcpSocket::readyRead,[=](){
QByteArray array;
array = tcpSocket->readAll();
/*追加到编辑区中*/
ui->textEdit_read->append(array);
});
Client::~Client()
{
delete ui;
}
void Client::on_pushButton_connect_clicked()
{
/*获取端口和IP*/
QString ip = ui->lineEditIP->text();
quint16 port = ui->lineEditPort->text().toInt();
if((ip != NULL) && (port != 0))
{
/*主动和服务器建立连接*/
/*默认是可读可写
对于ip地址需要转换一下
*/
tcpSocket->connectToHost(QHostAddress(ip),port);
}
}
void Client::on_pushButton_send_clicked()
{
if(tcpSocket != NULL)
{
/*获取编辑区内容*/
QString str = ui->textEdit_Write->toPlainText();
tcpSocket->write(str.toUtf8().data());
ui->textEdit_Write->setText("");
}
}
void Client::on_pushButton_close_clicked()
{
if(tcpSocket != NULL)
{
/*主动断开连接*/
tcpSocket->disconnectFromHost();
tcpSocket->close();
}
}