QT的TCP Socket通信仍然有服务端、客户端之分。服务端通过监听某个端口来监听是否有客户端连接到来,如果有连接到来,则建立新的SOCKET连接;客户端通过IP和PORT连接服务端,当成功建立连接之后,就可进行数据的收发了。需要注意的是,在QT中,QT把SOCKET当成输入输出流来对待的,数据的收发是通过read()和write()来进行的。
服务器:
1.创建QTcpServer对象
2.启动服务器(监听)调用成员方法listen(QHostAddress::Any,端口号)
3.当有客户端链接时候会发送newConnection信号,触发槽函数接受链接(得到一个与客户端通信的套接字QTcpSocket)
4.QTcpsocket发送数据用成员方法write,
5.读数据当客户端有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据
客户端 :
1.创建QTcpSocket对象
2.链接服务器connectToHost(QHostAddress(“ip”),端口号)
3.QTcpsocket发送数据用成员方法write,
4.读数据当对方有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据
服务器程序步骤:
//监听套接字
tcpServer = new QTcpServer(this);
//监听
tcpServer->listen(QHostAddress::Any,8888);
//如果客户端成功和服务器连接
//tcpServer会自动触发newConnection
connect(tcpServer,&QTcpServer::newConnection,
[=]()
{
//取出建立好的套接字
tcpSocket=tcpServer->nextPendingConnection();
//获取对方的IP和端口
QString ip = tcpSocket->peerAddress().toString();
qint16 port = tcpSocket->peerPort();
QString str = QString("[%1:%2] 成功连接").arg(ip).arg(port);
ui.textEdit->setText(str);//显示到编辑区
}
);
发送:
void widget::on_sendStrPushButton_clicked() {
QString str = ui.textEdit->toPlainText();
QByteArray buf = str.toUtf8().data();
tcpSocket->write(buf);
}
客户端程序步骤:
tcpSocket = new QTcpSocket(this);
connect(tcpSocket, &QTcpSocket::readyRead, this, &clientWidget::receiveData);
与服务端建立连接:
void clientWidget::buttonConnect()
{
//获取服务器的IP和端口
QString ip = ui.lineEditIP->text();
quint16 port = ui.lineEditPort->text().toInt();
tcpSocket->connectToHost(QHostAddress(ip),port);
}
接受服务端发送的信息:
void clientWidget::receiveData() {
//取出接收的内容
QByteArray buf = tcpSocket->readAll();
if (!buf.isNull())
{
ui.textEdit->setText(buf.data());
}
}