一、QTcpServer 与 QTcpSocket 基本操作
1.1 QTcpServer 的基本操作:
- 调用
listen监听端口。 - 连接信号
newConnection,在槽函数里调用nextPendingConnection获取连接进来的socket。
1.2 QTcpSocket 的基本操作:
- 调用
connectToHost连接服务器。 - 调用
waitForConnected判断是否连接成功。 - 连接信号
readyRead槽函数,异步读取数据。 - 调用
waitForReadyRead,阻塞读取数据。
二、服务器端
2.1 新建一个服务器端工程,填入
QT += network
#include<QtNetwork/QtNetwork>
2. mainwindows.h文件中加入成员
public:
void init();
private slots:
/// @brief 发送消息
void sendMessage();
/// @brief 接收数据
void onReciveData();
/// @brief 建立 tcp 监听事件
void newListen();
/// @brief 接收客户端连接
void acceptConnection();
/// @brief 错误输出
void showError(QAbstractSocket::SocketError);
private:
QTcpSocket *tcpSocket;
QTcpServer *tcpServer;
3. 函数的定义
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
init();
setWindowTitle(QString::fromLocal8Bit("Server"));
connect(ui->sendBtn,SIGNAL(clicked(bool)),SLOT(sendMessage()));
}
构造函数中,调用 init() 函数,当点击了发送按钮就会产生一个槽函数 sendMessage,然后直接调用这个槽函数。
void MainWindow::init()
{
tcpServer = new QTcpServer;
tcpSocket = new QTcpSocket;
newListen();
connect(tcpServer, SIGNAL(newConnection()), SLOT(acceptConnection()));
connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(showError(QAbstractSocket::SocketError)));
}
新建一个 QTcpServer 类的对象,和 QTcpSocket 类的对象。调用 newlisten() 监听服务器的 socket 请求函数,有新的连接的时候,调用 acceptConnection() 函数,失败的话调用 showError()。
void MainWindow::newListen()
{
if(!tcpServer->listen(QHostAddress::Any,6666))
{
qDebug()<<tcpServer->errorString();
tcpServer->close();
}
}
QHostAddress::Any4 双 any-address 栈,与该地址绑定的 socket 将侦听 IPv4,6666 端口。
void MainWindow::acceptConnection()
{
tcpSocket = tcpServer->nextPendingConnection();
connect(tcpSocket,SIGNAL(readyRead()),SLOT(onReciveData()));
}
连接成功后,连接信号 readyRead(),调用 onReciveData()。
// ---------------------------
void MainWindow::sendMessage() //发送数据
{
QString textEdit = ui->lineEdit->text();
QString strData =QString::fromLocal8Bit("Time: ") + QTime::currentTime().toString() + "\n" + textEdit.toLocal8Bit() + "\n";
QByteArray sendMessage = strData.toLocal8Bit();
mChat += ("Send " + sendMessage);
ui->textEdit->setText(mChat);
tcpSocket->write(sendMessage);
}
// ----------------------------
void MainWindow::onReciveData() //读取数据
{
QString data = tcpSocket->readAll();
qDebug()<<data;
mChat +=("Recv " + data);
ui->textEdit->setText(mChat);
}
发送数据,获取编辑框中的字符串,发送。