项目需求:使用QT的TCP实现客户端与服务端的通信,界面如下
写在开头:几个重要的方法与信号
//监听方法,监听本机所有IP的9999端口
tcpServer->listen(QHostAddress::Any, 9999);
//当新连接建立时触发该信号
&QTcpServer::newConnection
//A. 取出tcpSocket套接字
tcpSocket = tcpServer->nextPendingConnection();
//B. 取出套接字中的IP信息
QString ip = tcpSocket->peerAddress().toString();
qint16 port = tcpSocket->peerPort();
//收到对方发来的数据的时候触发该信号
&QTcpSocket::readyRead
//将数据写入通信套接字
tcpSocket->write(str.toUtf8().data());
//断开与客户端的连接
tcpSocket->disconnectFromHost();
tcpSocket->close();
服务端的实现
1. 引用网络模块到QT中( .pro文件)
QT += network #1. 引用网络模块
2. 引用套接字头文件(server.h)
//2. 引用头文件
#include <QTcpServer> //监听套接字
#include <QTcpSocket> //通信套接字
#include <QHostAddress>
3. 创建套接字对象(server.h)
private:
Ui::ServerWidget *ui;
//3. 创建对象
QTcpServer *tcpServer; //监听套接字
QTcpSocket *tcpSocket; //通信套接字
4. 给对象分配空间(server.cpp)
//4. 给对象分配空间
tcpServer = new QTcpServer(this); //监听套接字
5. 引用Lamda表达式模块(.pro)
CONFIG += C++11 #5. 需要使用Lamda表达式
6. 监听端口(server.cpp)
//6. 服务端监听本机的所有IP中的9999端口
tcpServer->listen(QHostAddress::Any, 9999);
7. 取出套接字中的信息(server.cpp)
//7. 取出tcpSocket中的信息
connect(tcpServer, &QTcpServer::newConnection,
[=]()
{
//A. 取出tcpSocket套接字
tcpSocket = tcpServer->nextPendingConnection();
//B. 取出套接字中的IP信息
QString ip = tcpSocket->peerAddress().toString();
qint16 port = tcpSocket->peerPort();
//C. 拼接显示信息
QString temp = QString("[%1:%2]:Connect Success!").arg(ip).arg(port);
ui->textEditReceive->setText(temp);
//D. 接受数据
connect(tcpSocket, &QTcpSocket::readyRead,
[=]()
{
//读取通信套接字中的所有数据
QByteArray array = tcpSocket->readAll();
//显示到UI中
ui->textEditReceive->append(array);
}
);
}
);
8. 实现发送功能(server.cpp)
//当发送按钮被点击的时候,发送内容到客户端
void ServerWidget::on_buttonSend_clicked()
{
if(tcpSocket == NULL)
{
return;
}
//A. 获取文本框的内容
QString str = ui->textEditSend->toPlainText();
//B. 将数据写入通信套接字
tcpSocket->write(str.toUtf8().data());
}
9. 实现断开连接功能(server.cpp)
//当点击关闭的时候,断开与客户端的连接
void ServerWidget::on_buttonClose_clicked()
{
if(tcpSocket == NULL)
{
return;
}
tcpSocket->disconnectFromHost();
tcpSocket->close();
tcpSocket = NULL;
ui->textEditReceive->append("与客户端连接已断开");
}
下一篇实现客户端。
本文原创,转载请注明出处。